2015-11-02 3 views
0

Base on This Answer, я могу получить атрибут описания из класса Property следующим образом:Извлечение атрибутов из Const полей

public class A 
{ 
    [Description("My Property")] 
    public string MyProperty { get; set; } 
} 

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

// result: My Property 
var foo = AttributeHelper.GetPropertyAttributeValue<A, string, DescriptionAttribute, string>(x => x.MyProperty, y => y.Description); 

и теперь, Что изменения Должен ли я в этом помощнике получить описание от cosntfields следующим образом:

public class A 
{ 
    [Description("Const Field")] 
    public const string ConstField = "My Const"; 
} 

// output: Const Field 
var foo = AttributeHelper.GetPropertyAttributeValue<A, string, DescriptionAttribute, string>(x => x.ConstField, y => y.Description); 

ответ

0

Получение значения объектов Const поле путем отражения:

using System; 
using System.Linq; 
using System.Linq.Expressions; 
using System.Reflection; 

public static class AttributeHelper 
{ 
    public static TOut GetConstFieldAttributeValue<T, TOut, TAttribute>(
     string fieldName, 
     Func<TAttribute, TOut> valueSelector) 
     where TAttribute : Attribute 
    { 
     var fieldInfo = typeof(T).GetField(fieldName, BindingFlags.Public | BindingFlags.Static); 
     if (fieldInfo == null) 
     { 
      return default(TOut); 
     } 
     var att = fieldInfo.GetCustomAttributes(typeof(TAttribute), true).FirstOrDefault() as TAttribute; 
     return att != null ? valueSelector(att) : default(TOut); 
    } 
} 

Пример:

public class A 
{ 
    [Description("Const Field")] 
    public const string ConstField = "My Const"; 
} 

class Program 
{ 

    static void Main(string[] args) 
    { 
     var foo = AttributeHelper.GetConstFieldAttributeValue<A, string, DescriptionAttribute>("ConstField", y => y.Description); 

     Console.WriteLine(foo); 
    } 
} 
+0

Я хочу использовать этот помощник, который даст мне IntelliSense для моего класса, и использовать общие выгоды. – Amir

+0

@ Добавленный мой предыдущий ответ добавленный модифицированный пример. –

+0

С вашей модификацией ошибка компилятора: невозможно получить доступ ('Id' является' const') с ссылкой на экземпляр. – Amir