尝试在子属性上调用方法
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
的更多详细信息
在我的 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
的更多详细信息