反射:获取属性值的不同方式

Posted

技术标签:

【中文标题】反射:获取属性值的不同方式【英文标题】:Reflection: different ways to retrieve property value 【发布时间】:2010-03-03 11:52:36 【问题描述】:

我正在通过以下代码检索 IEnumerable 属性列表:

BindingFlags bindingFlag = BindingFlags.Instance | BindingFlags.Public;  
var dataProperties = typeof(myParentObject).GetProperties(bindingFlag);

然后我遍历列表并检索每个属性的值。

我遇到了两种不同的方法来做到这一点,只是想知道它们之间有什么区别:

1)

object propertyValue = property.GetGetMethod().Invoke(myObject, null);

2)

object propertValue = property.GetValue(myObject, null)

【问题讨论】:

【参考方案1】:

其实没有区别。使用Reflector可以看到GetValue的实现:

public override object GetValue(object obj, BindingFlags invokeAttr,
                                Binder binder, object[] index,
                                CultureInfo culture)

    MethodInfo getMethod = this.GetGetMethod(true);
    if (getMethod == null)
    
        throw new ArgumentException(
                             Environment.GetResourceString("Arg_GetMethNotFnd"));
    
    return getMethod.Invoke(obj, invokeAttr, binder, index, null);

这里的实际类型是 RuntimePropertyInfoPropertyInfo 是一个抽象类,不提供 GetValue 的实现)。

【讨论】:

以上是关于反射:获取属性值的不同方式的主要内容,如果未能解决你的问题,请参考以下文章

C#通过反射获取不同命名空间下的类(属性和方法)

怎么通过反射获得实体类中List类型的对象的各个属性?

第三课:JAVA反射机制

C#利用反射实现两个类的对象之间相同属性的值的复制

使用反射循环获取Bean中的属性

光学基于matlab光折射反射(不同界面)含Matlab源码 2372期