在我的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);
}
我目前收到此消息:
非静态方法需要目标。
我确定我错过了一些简单的事情。我做错了什么?
答案 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
的更多详细信息