如何从值中获取字段的FieldInfo

时间:2015-02-26 19:46:55

标签: c# reflection fieldinfo

我想访问FieldInfo,用于字段上的CustomAttributes以及其他目的,但是我不想使用字符串来访问该字段,也不想运行所有字段一堂课。

如果我只是,

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

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

是否有ref myIntout myInt提供的任何魔法,或某些我不知道的关键字可以让我访问,或者是我只限于需要字符串名称来获取它吗?

2 个答案:

答案 0 :(得分:2)

你的意思是从编译的表达式而不是字符串中获取memberinfo? e.g

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


}

答案 1 :(得分:1)

C# 6(您可以获得CTP here)中有nameof(...)运算符 - 您可以使用:

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

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