[c#] Wie Zugriff auf das Attribut Beschreibung für eine Eigenschaft oder eine Konstante in C #?


1 Answers

Versuche Folgendes

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

Wie greifen Sie auf die Description-Eigenschaft auf einer Const oder einer Eigenschaft zu, dh

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 aufrufenden Klasse möchte ich auf die Description-Eigenschaft zugreifen, dh

int x = Group.UserExistsInGroup;
string description = Group.UserExistsInGroup.GetDescription(); // or similar

Ich bin offen für Ideen zu anderen Methoden.

EDIT: Ich hätte erwähnt, dass ich ein Beispiel gesehen habe, das hier zur Verfügung gestellt wird: Unterstützen automatisch implementierte Eigenschaften Attribute?

Ich suche jedoch nach einer Methode, um auf das Beschreibungsattribut zuzugreifen, ohne ein Zeichenfolgenliteral in den Eigenschaftstyp eingeben zu müssen, dh ich möchte das nicht tun:

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

Etwas in der Art einer Erweiterungsmethode; ähnlich der folgenden Methode, die das Attribut Description für eine Enum über eine Erweiterungsmethode zurückgibt:

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";
    }
}



Hier ist eine Hilfsklasse, die ich für die Verarbeitung von benutzerdefinierten Attributen in .NET verwende

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 zeigen, wie diese Klasse verwendet wird

[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/






Related