尝试在子属性上调用方法

Trying to invoke method on child properties

在我的 C# 应用程序中,我有时会处理从我的 class 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);
}

我目前收到这条消息:

Non-static method requires a target.

我确定我遗漏了一些简单的东西。我做错了什么?

一个问题是 thisProperty.GetValue(testCompanyUser) 可以 return 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 mentioned. You can read this MSDN 页面以获取有关何时抛出 Exception 的更多详细信息