通过反射从通用对象属性获取值

时间:2011-05-13 23:46:23

标签: c# generics reflection

我只想从通用属性中获取所有域对象的主标识符 代码到现在为止:

IEnumerable<PropertyInfo> customProperties = genericObject.GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

foreach (PropertyInfo justAuditElementProperties in customProperties) {

    IEnumerable<PropertyInfo> elementsToAudit = justAuditElementProperties.PropertyType.GetProperties().Where(p => Attribute.IsDefined(p, typeof (AuditeAttribute)));
    foreach (PropertyInfo element in elementsToAudit) {
        string name = justAuditElementProperties.PropertyType.FullName + "." + element.Name;
        string value = element.GetValue( ? , null).ToString();
        atributoNomeValor.Add(name, value);
    }
}

的正确替代是什么?

- 因此,重要的是要说每个主要标识符都有[Audite]属性

修改
的类型?是genericObject的属性的类型。例如:
部门是genericObject。
经理是一个财产。 所以在这种情况下,我想要element.GetValue( ? , null).ToString();,其中此元素在Manager类中声明为:

 [Audite]
 public string name { get; set; }

解决方案
这使用@ liho1eye的解决方案,我刚刚添加了一个空参考验证,这对我来说会产生一些问题。

var propertyParent = justAuditElementProperties.GetValue(genericObject, null);
string value = propertyParent != null ? element.GetValue(propertyParent, null).ToString() : "";

2 个答案:

答案 0 :(得分:1)

这将是您的对象的实例

string value = element.GetValue(justAuditElementProperties.GetValue(genericObject, null), null).ToString();

答案 1 :(得分:0)

应该是您的genericObject

就我可以编译而言,你只是通过genericObject的属性进行迭代。识别具有“AuditeAttribute”的属性,然后获取它的值。

有关完整详情,请参阅MSDN