Как получить FieldInfo поля из значения

Я хочу получить доступ к 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 "myInt" напрямую через функцию "GetField", если у меня есть строка с его именем, или циклически перебирать "GetFields", что опять-таки будет зависеть от наличия строки "myInt", чтобы гарантировать Правильное поле.

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

2 ответа

Решение

Вы имеете в виду получение memberinfo из скомпилированного выражения, а не из строки? например

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


}

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

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

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

Другие вопросы по тегам