试图在子属性上调用方法

时间:2017-02-08 13:55:34

标签: c# reflection invoke

在我的C#应用​​程序中,我有时会处理从类BaseDomainModel继承的对象,该类具有方法public virtual void ValidateModel()。对于我的示例,我获取了一个CompanyUser对象的实例,该对象至少有一个属性继承自BaseDomainModel

我想浏览这些属性并在这些属性上调用ValidateModel()方法。

这是我到目前为止所做的:

var validatableProperties = testCompanyUser.GetType().GetProperties().Where(p => p.PropertyType.BaseType == typeof(BaseDomainModel));
foreach (var thisProperty in validatableProperties)
{
    var m = thisProperty.PropertyType.GetMethod("ValidateModel", Type.EmptyTypes);
    m.Invoke(thisProperty.GetValue(testCompanyUser), null);
}

我目前收到此消息:

  

非静态方法需要目标。

我确定我错过了一些简单的事情。我做错了什么?

1 个答案:

答案 0 :(得分:2)

一个问题是thisProperty.GetValue(testCompanyUser)可以返回null(因为保留了引用类型),而您没有检查它。

第二个问题是,您没有在属性和方法请求中设置BindingFlags

尝试这样的事情:

foreach(var property in testCompanyUser.GetType().GetProperties(BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public).Where(p => p.PropertyType.BaseType == typeof(BaseDomainModel)))
{
    var method = property.PropertyType.GetMethod("ValidateModel", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
    object propValue = property.GetValue(testCompanyUser);
    if(method != null && propValue != null)
    {
        m.Invoke(propValue, null);
    }

提到@Phil Cooper。您可以阅读this MSDN页面以获取有关何时抛出Exception的更多详细信息