2017-02-08 3 views
0

В моем приложении 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); 
} 

В настоящее время я получаю это сообщение:

Non-статический метод требует цели.

Уверен, что мне не хватает чего-то простого. Что я сделал не так?

ответ

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 выбрано

+1

Чтобы восстановить это, [msdn] (https://msdn.microsoft.com/en-us/library/a89hcwhh (v = vs.110) .aspx) детализирует использование Invoke и, в частности, условия, при которых будет вызываться 'TargetException'. –

Смежные вопросы