代码之家  ›  专栏  ›  技术社区  ›  Keith Fitzgerald

如何获取MemberInfo的值?

  •  28
  • Keith Fitzgerald  · 技术社区  · 16 年前

    如何获得 MemberInfo .Name 返回变量的名称,但我需要该值。

    我想你可以用 FieldInfo 但我没有一个片段,如果你知道怎么做,你能提供一个片段吗??

    3 回复  |  直到 11 年前
        1
  •  32
  •   Jon Skeet    16 年前

    下面是一个字段示例,使用 FieldInfo.GetValue :

    using System;
    using System.Reflection;
    
    public class Test
    {
        // public just for the sake of a short example.
        public int x;
    
        static void Main()
        {
            FieldInfo field = typeof(Test).GetField("x");
            Test t = new Test();
            t.x = 10;
    
            Console.WriteLine(field.GetValue(t));
        }
    }
    

    类似的代码适用于使用 PropertyInfo.GetValue() -尽管在那里,您还需要将任何参数的值传递给属性。(对于“normal”C#属性不会有任何属性,但是对于框架来说,C#索引器也算属性。)对于方法,您需要调用 Invoke 如果要调用该方法并使用返回值。

        2
  •  27
  •   Community Egal    7 年前

    this question ):

        public static object GetValue(this MemberInfo memberInfo, object forObject)
        {
            switch (memberInfo.MemberType)
            {
                case MemberTypes.Field:
                    return ((FieldInfo)memberInfo).GetValue(forObject);
                case MemberTypes.Property:
                    return ((PropertyInfo)memberInfo).GetValue(forObject);
                default:
                    throw new NotImplementedException();
            }
        } 
    
        3
  •  11
  •   Marc Gravell    16 年前

    乔恩的回答很理想——只有一个观察:作为总体设计的一部分,我会:

    1. 通常地 避免反省
    2. 避免使用公共字段(几乎总是如此)

    通常地 您只需要针对公共属性进行反射(除非您知道方法的作用,否则不应该调用它们;属性getter是 预期 是等幂的[懒散地放在一边]。所以对于一个 PropertyInfo 这只是 prop.GetValue(obj, null); .

    System.ComponentModel ,所以我想使用:

        foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
        {
            Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
        }
    

    或者对于特定的财产:

        PropertyDescriptor prop = TypeDescriptor.GetProperties(obj)["SomeProperty"];
        Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
    

    一个优点 系统组件模型 DataView 将列公开为虚拟属性;还有其他技巧(如 performance tricks ).