如何从值中获取字段的 FieldInfo

How to get the FieldInfo of a field from the value

我想访问 FieldInfo,用于字段上的 CustomAttributes 以及其他目的,但我不希望使用字符串来访问该字段,也不必 运行 通过class.

中的所有字段

如果我有,

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

我知道我可以通过 "GetField" 函数直接访问 "myInt" 的 FieldInfo,如果我有它的名称字符串,或者循环通过 "GetFields",那将再次依赖使用字符串 "myInt" 以确保您拥有正确的字段。

是否有像 ref myIntout myInt 或一些我还不知道的关键字可以让我访问的魔法,或者我是否仅限于需要要获取的字符串名称?

您的意思是从编译的表达式而不是字符串中获取成员信息?例如

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 (you can get the CTP here) 中有 nameof(...) 运算符 - 你会使用:

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

这是您的选择,还是必须使用 C# 5.0 (.NET 4.5)?