2009-03-30 5 views
12

Wie beurteilen Sie die Beschreibung Eigenschaft Zugriff entweder auf einem const oder einer Eigenschaft, dhWie kann ich auf das Attribut Beschreibung einer Eigenschaft oder einer Konstanten in C# zugreifen?

public static class Group 
{ 

    [Description("Specified parent-child relationship already exists.")] 
    public const int ParentChildRelationshipExists = 1; 

    [Description("User is already a member of the group.")] 
    public const int UserExistsInGroup = 2; 

} 

oder

public static class Group 
{ 

    [Description("Specified parent-child relationship already exists.")] 
    public static int ParentChildRelationshipExists { 
     get { return 1; } 
    } 

    [Description("User is already a member of the group.")] 
    public static int UserExistsInGroup { 
     get { return 2; } 
    } 

} 

In der anrufenden Klasse Ich mag würde die Beschreibung Eigenschaft zuzugreifen, das heißt,

Ich bin offen für Ideen zu anderen Methoden als auch.

EDIT: ich erwähnt habe, sollte, dass ich ein Beispiel zur Verfügung gestellt hier gesehen habe: Do auto-implemented properties support attributes?

Aber ich bin auf der Suche nach einer Methode ohne die Beschreibung Attribut für den Zugriff auf einen Stringliteral einzugeben in den Objekttyp, das heißt, würde ich lieber nicht tun:

typeof(Group).GetProperty("UserExistsInGroup"); 

Etwas nach dem Vorbild einer Erweiterungsmethode; ähnlich dem folgenden Verfahren, das die Beschreibung Attribut auf einer Enum über eine Erweiterungsmethode zurück:

public static String GetEnumDescription(this Enum obj) 
{ 
    try 
    { 
     System.Reflection.FieldInfo fieldInfo = 
      obj.GetType().GetField(obj.ToString()); 

     object[] attribArray = fieldInfo.GetCustomAttributes(false); 

     if (attribArray.Length > 0) 
     { 
      var attrib = attribArray[0] as DescriptionAttribute; 

      if(attrib != null ) 
       return attrib.Description; 
     } 
     return obj.ToString(); 
    } 
    catch(NullReferenceException ex) 
    { 
     return "Unknown"; 
    } 
} 
+0

In Antwort zu verwenden: siehe diese http://www.codeproject.com/Articles/28514/Strong-Reflection-without -Magic-Strings als eine Möglichkeit, die Eigenschaft Informationen sicher zu bekommen. – walpen

Antwort

4

Sie können auch anrufen MemberInfo.GetCustomAttributes() erhalten alle benutzerdefinierten Attribute definiert auf einem Mitglied a Type. Sie können die MemberInfo für die Eigenschaft erhalten, indem so etwas wie dies zu tun:

PropertyInfo prop = typeof(Group).GetProperty("UserExistsInGroup", 
    BindingFlags.Public | BindingFlags.Static); 
+0

@Andy - Entschuldigung, hätte ich geklärt haben, siehe meine Bearbeitung. –

+0

Ich glaube nicht, dass das möglich ist, zumindest Attribute wie du bist. Sie müssen das PropertyInfo für die Eigenschaft abrufen, und die einzige Möglichkeit dazu besteht darin, über den Namen der Eigenschaft danach zu suchen. – Andy

14

Versuchen Sie, die folgende

var property = typeof(Group).GetProperty("UserExistsInGroup"); 
var attribute = property.GetCustomAttributes(typeof(DescriptionAttribute), true)[0]; 
var description = (DescriptionAttribute)attribute; 
var text = description.Description; 
+0

@JaredPar - Entschuldigung, ich hätte klarstellen müssen, siehe meine Bearbeitung. –

+0

Ich weiß, es ist eine ziemlich alte Antwort, sollte aber nicht 'var description = (DescriptionAttribute) -Attribut sein;'? – Jack

2

Okay, ich habe deine Bearbeitung gesehen, ich bin nicht sicher, ob Sie es mit Erweiterungsmethoden tun, wie sie anaware der wäre Typ der enthaltenden Klasse.

Das klingt ein bisschen verrückt, aber wie wäre es mit einer neuen Klasse eine "DescribedInt", die einen impliziten Cast-Operator haben würde, damit Sie es automatisch als int verwenden können? Sie können so viel wie Sie beschreiben verwenden. Sie müssen noch eine Beschreibung, aber wenn man es wie ein Int verwenden müssen, man wird nicht‘müssen die .Data Eigenschaft erhalten ...

zB:

private void ExampleUse() 
{ 
    int myvalue = Group.A; //see, no need to cast or say ".Data" - implicit cast 
    string text = Group.A.Description; 

// Dinge zu tun mit Werte ... }

public static class Group 
{ 
    public static DescribedInt A = new DescribedInt(12, "some description"); 
    public static DescribedInt B = new DescribedInt(88, "another description"); 
} 

public class DescribedInt 
{ 
    public readonly int data; 
    public readonly string Description; 

    public DescribedInt(int data, string description) 
    { 
     this.data = data; 
     this.Description = description; 
    } 

    //automatic cast to int 
    public static implicit operator int(DescribedInt orig) 
    { 
     return orig.data; 
    } 

    //public DescribedInt(string description) 
    //{ 
    // this.description = description; 
    //} 

    //if you ever need to go the "other way" 
    //public static implicit operator DescribedInt(int orig) 
    //{ 
    // return new DescribedInt(orig, ""); 
    //} 
} 
+0

@Ilya - das kann eine brauchbare Alternative sein. Ich werde morgen genau hinsehen. Vielen Dank! –

2

Hier ist eine Hilfsklasse I für die Verarbeitung von benutzerdefinierten bin mit in .NET-Attribute

public class AttributeList : List<Attribute> 
{ 
    /// <summary> 
    /// Gets a list of custom attributes 
    /// </summary> 
    /// <param name="propertyInfo"></param> 
    /// <returns></returns> 
    public static AttributeList GetCustomAttributeList(ICustomAttributeProvider propertyInfo) 
    { 
     var result = new AttributeList(); 
     result.AddRange(propertyInfo.GetCustomAttributes(false).Cast<Attribute>()); 
     return result; 
    } 

    /// <summary> 
    /// Finds attribute in collection by its type 
    /// </summary> 
    /// <typeparam name="T"></typeparam> 
    /// <returns></returns> 
    public T FindAttribute<T>() where T : Attribute 
    { 
     return (T)Find(x => typeof(T).IsAssignableFrom(x.GetType())); 
    } 

    public bool IsAttributeSet<T>() where T : Attribute 
    { 
     return FindAttribute<T>() != null; 
    } 
} 

Auch Unit-Tests für MSTest zeigt, wie diese Klasse auf Ihre bearbeiten

[TestClass] 
public class AttributeListTest 
{ 
    private class TestAttrAttribute : Attribute 
    { 
    } 

    [TestAttr] 
    private class TestClass 
    { 
    } 

    [TestMethod] 
    public void Test() 
    { 
     var attributeList = AttributeList.GetCustomAttributeList(typeof (TestClass)); 
     Assert.IsTrue(attributeList.IsAttributeSet<TestAttrAttribute>()); 
     Assert.IsFalse(attributeList.IsAttributeSet<TestClassAttribute>()); 
     Assert.IsInstanceOfType(attributeList.FindAttribute<TestAttrAttribute>(), typeof(TestAttrAttribute)); 
    } 
} 

http://www.kozlenko.info/2010/02/02/getting-a-list-of-custom-attributes-in-net/

+0

Ich habe es zur Arbeit hier ist mein Code: var attributeList = AttributeList.GetCustomAttributeList (MethodInfo.GetCurrentMethod()); var attribut = attributeList.FindAttribute (). Beschreibung; – Omzig

Verwandte Themen