Доступ к значению пользовательского атрибута - PullRequest
21 голосов
/ 30 июня 2011

У меня есть этот пользовательский атрибут:

[AttributeUsage(AttributeTargets.Method, AllowMultiple=false, Inherited = true)]
class MethodTestingAttibute : Attribute
{   
    public string Value{ get; private set; }
    public MethodTestingAttibute (string value)
    {
        this.Value= value;

    }
}

Для использования следующим образом:

[MethodTestingAttibute("2")]
public int m1() {return 3; }

И моя сложность состоит в том, чтобы взять значение "2" MethodTestingAttibute

object result = method.Invoke(obj, new Type[] {}); // here i get the return

Теперь я хочу сравнить этот результат со значением MethodTestingAttibute. Как я могу это сделать? Я пытаюсь идти по этому пути, но безуспешно:

method.GetCustomAttributes(typeof(MethodTestAttibute), true)[0]...

Как правильно получить доступ к полю настраиваемого атрибута?

Ответы [ 7 ]

27 голосов
/ 30 июня 2011
var attribute =
   (MethodTestingAttibute)
   typeof (Vehicles)
      .GetMethod("m1")
      .GetCustomAttributes(typeof (MethodTestingAttibute), false).First();
Console.WriteLine(attribute.Value);
2 голосов
/ 21 сентября 2017

С моим пользовательским атрибутом:

[AttributeUsage(AttributeTargets.Method)]
public class AttributeCustom : Attribute
{
    public string MyPropertyAttribute { get; private set; }

    public AttributeCustom(string myproperty)
    {
        this.MyPropertyAttribute = myproperty;
    }
}

Я создаю метод для получения атрибута с его значениями:

public static AttributeCustom GetAttributeCustom<T>(string method) where T : class
{
    try
    {
        return ((AttributeCustom)typeof(T).GetMethod(method).GetCustomAttributes(typeof(AttributeCustom), false).FirstOrDefault());
    }
    catch(SystemException)
    {
        return null;
    }
}

С примером класса (должен быть не статичным, потому что T является универсальным)

public class MyClass
{
    [AttributeCustom("value test attribute")])
    public void MyMethod() 
    {
        //...
    }
}

Использование:

var customAttribute = GetAttributeCustom<MyClass>("MyMethod");
if (customAttribute != null)
{
    Console.WriteLine(customAttribute.MyPropertyAttribute);
}
1 голос
/ 30 июня 2011

Проверьте код здесь http://msdn.microsoft.com/en-us/library/bfwhbey7.aspx

Выдержка:

        // Get the AClass type to access its metadata.
        Type clsType = typeof(AClass);
        // Get the type information for Win32CallMethod.
        MethodInfo mInfo = clsType.GetMethod("Win32CallMethod");
        if (mInfo != null)
        {
            // Iterate through all the attributes of the method.
            foreach(Attribute attr in
                Attribute.GetCustomAttributes(mInfo)) {
                // Check for the Obsolete attribute.
                if (attr.GetType() == typeof(ObsoleteAttribute))
                {
                    Console.WriteLine("Method {0} is obsolete. " +
                        "The message is:",
                        mInfo.Name);
                    Console.WriteLine("  \"{0}\"",
                        ((ObsoleteAttribute)attr).Message);
                }

                // Check for the Unmanaged attribute.
                else if (attr.GetType() == typeof(UnmanagedAttribute))
                {
                    Console.WriteLine(
                        "This method calls unmanaged code.");
                    Console.WriteLine(
                        String.Format("The Unmanaged attribute type is {0}.",
                                      ((UnmanagedAttribute)attr).Win32Type));
                    AClass myCls = new AClass();
                    myCls.Win32CallMethod();
                }
            }
        }
1 голос
/ 30 июня 2011

Приведите объект к MethodTestingAttibute:

object actual = method.Invoke(obj, null);

MethodTestingAttibute attribute = (MethodTestingAttibute)method.GetCustomAttributes(typeof(MethodTestAttribute), true)[0];
string expected = attribute.Value;

bool areEqual = string.Equals(expected, actual != null ? actual.ToString() : null, StringComparison.Ordinal);
1 голос
/ 30 июня 2011

Пожалуйста, смотрите следующую ссылку, она получает атрибут enum, но вы можете настроить его, чтобы получить свой собственный атрибут.

Получение атрибута Enum

0 голосов
/ 12 июня 2017

Necromancing.
Для тех, кому еще нужно поддерживать .NET 2.0, или тех, кто хочет сделать это без LINQ:

public static object GetAttribute(System.Reflection.MemberInfo mi, System.Type t)
{
    object[] objs = mi.GetCustomAttributes(t, true);

    if (objs == null || objs.Length < 1)
        return null;

    return objs[0];
}



public static T GetAttribute<T>(System.Reflection.MemberInfo mi)
{
    return (T)GetAttribute(mi, typeof(T));
}


public delegate TResult GetValue_t<in T, out TResult>(T arg1);

public static TValue GetAttributValue<TAttribute, TValue>(System.Reflection.MemberInfo mi, GetValue_t<TAttribute, TValue> value) where TAttribute : System.Attribute
{
    TAttribute[] objAtts = (TAttribute[])mi.GetCustomAttributes(typeof(TAttribute), true);
    TAttribute att = (objAtts == null || objAtts.Length < 1) ? default(TAttribute) : objAtts[0];
    // TAttribute att = (TAttribute)GetAttribute(mi, typeof(TAttribute));

    if (att != null)
    {
        return value(att);
    }
    return default(TValue);
}

Пример использования:

System.Reflection.FieldInfo fi = t.GetField("PrintBackground");
wkHtmlOptionNameAttribute att = GetAttribute<wkHtmlOptionNameAttribute>(fi);
string name = GetAttributValue<wkHtmlOptionNameAttribute, string>(fi, delegate(wkHtmlOptionNameAttribute a){ return a.Name;});

или в вашем случае просто

MethodInfo mi = typeof(Vehicles).GetMethod("m1");
string aValue = GetAttributValue<MethodTestingAttibute, string>(mi, a => a.Value);
0 голосов
/ 30 июня 2011

Чтобы получить значение свойства атрибута, просто приведите объект, возвращенный GetCustomAttributes ():

{
    string val;
    object[] atts = method.GetCustomAttributes(typeof(MethodTestAttibute), true);
    if (atts.Length > 0)
       val = (atts[0] as MethodTestingAttibute).Value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...