【问题标题】:How to get the FieldInfo of a field from the value如何从值中获取字段的FieldInfo
【发布时间】:2015-02-26 19:46:54
【问题描述】:

我想访问 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”确保您拥有正确的字段。

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

【问题讨论】:

  • 你知道提前获取信息的领域吗?

标签: c# reflection fieldinfo


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 很有帮助,对某些人来说可能是正确的答案,但#6 目前对我来说不是一个选项,但我最终会使用这种方法。谢谢。
    • 没问题。 @JamesSimpson 发布的方法是我们在我工作的地方使用的方法(而且效果很好)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多