0

我想访问 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) ) );
        }
    }
}

我知道我可以通过“GetField”函数直接访问“myInt”的FieldInfo,如果我有它的名称字符串,或者循环通过“GetFields”,这将再次依赖于字符串“myInt”来确保你' ve 正确的领域。

是否有任何可用的魔法,例如ref myInt, 或out myInt,或一些我还不知道的关键字可以让我访问,或者我是否仅限于需要字符串名称来获取它?

4

2 回答 2

2

Do you mean getting the memberinfo from a compiled expression rather than the string? 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;   
    }
}
于 2015-02-26T20:38:21.923 回答
1

C# 6中(您可以在此处获取 CTP )有nameof(...)运算符 - 您将使用:

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

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

于 2015-02-26T20:42:55.667 回答