2015-02-26 7 views
0

Я хочу получить доступ к FieldInfo, для атрибутов CustomAttributes, которые находятся в поле, и в других целях, но я бы предпочел не использовать строку для доступа к этому полю, для выполнения всех полей в классе.Как получить поле FieldInfo поля из значения

Если я просто,

class MyClass 
{ 
#pragma warning disable 0414, 0612, 0618, 0649 
    private int myInt; 
#pragma warning restore 0414, 0612, 0618, 0649 

    public MyClass() 
    { 
     BindingFlags flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; 
     Console.WriteLine(GetType().GetField("myInt", flags)); 

     foreach(FieldInfo fi in GetType().GetFields(flags)) 
     { 
      Console.WriteLine(string.Format("{0} {1} {2}", fi.Name, myInt, fi.GetValue(this))); 
     } 
    } 
} 

Я знаю, что я могу получить доступ к FieldInfo из «Минт» непосредственно с помощью функции «ПолучитьПолеЗаголовка», если у меня есть строка это имя, или езда на велосипеде через «GetFields» , который снова будет полагаться на строку «myInt», чтобы убедиться, что у вас есть правильное поле.

Есть ли какой-либо магии, которая доступна как ref myInt или out myInt, или некоторые ключевые слова, которые я не знаю о еще, которые дали бы мне доступ, или я ограничивается нуждаясь имя строки, чтобы получить его?

+0

Знаете ли вы поле для получения информации раньше времени? – TYY

ответ

1

Вы хотите получить членinfo от скомпилированного выражения, а не строки? например

class Program 
{ 
    public static void Main() 
    { 
     var cls = new MyClass(); 
     Console.WriteLine(GetMemberInfo(cls, c => c.myInt)); 
     Console.ReadLine(); 
    } 

    private static MemberInfo GetMemberInfo<TModel, TItem>(TModel model, Expression<Func<TModel, TItem>> expr) 
    { 
     return ((MemberExpression)expr.Body).Member; 
    } 

    public class MyClass 
    { 
     public int myInt; 
    } 


} 
+0

Прекрасно, что отлично работает для меня, спасибо! – seaders

1

В C# 6 (вы можете получить CTP here) есть оператор nameof(...) - вы бы использовать:

string name = nameof(myInt); 
var fieldInfo = GetType().GetField(name, flags); 

Это вариант для вас, или должны использовать C# 5.0 (.NET 4.5)?

+0

Полезный и потенциально правильный ответ для некоторых, но №6 для меня сейчас не вариант, но я буду использовать этот метод, когда он в конце концов. Благодарю. – seaders

+0

Нет проблем. Выложенный метод @JamesSimpson - это то, что мы используем, где я работаю (и он работает хорошо). –