2017-01-22 5 views
1

Я работаю над бизнес-моделью для своего первого проекта (пожалуйста, извините меня, если кто-то обнаруживает, что у моего кода недостаток качества, важно то, что я добиваюсь прогресса). Я застрял, пытаясь найти причину ошибки. Я создаю представление, основанное на отражении свойств и пользовательских атрибутов. Я получаю исключение с нулевой ссылкой, когда во второй раз я использую PropertyInfo.GetCustomAttribute в свойстве свойства. Почему мой второй вызов возвращает null. Как вы видите, я применил атрибут свойства (_TopSchools), на который я вызываю метод.Получите исключение в PropertyInfo.GetCustomAttribute <T>

public class EducationFilter : Filter 
{ 
    [FilterAttribute(FilterType.Child, "Topschools")]//I cant get this attr! 
    public TopSchoolFilter _TopSchool { get; set; } 
} 

public class TopSchoolFilter :BooleanFilter 
{ 

} 

public class Filters 
{ 
    [FilterAttribute(FilterType.Parent, "Education")] //This i can... 
    public EducationFilter _EducationFilter { get; set; } 

    public Filters(EducationFilter educationFilter) 
    { 
     this._EducationFilter = educationFilter; 
    } 
} 

public StackLayout GenerateFilterView(PropertyInfo p,TestModel vm) 
     { 
      StackLayout tempStack = new StackLayout(); 
      **FilterAttribute filterAttr = p.GetCustomAttribute<FilterAttribute>();**//This returns the attr instance 
      IEnumerable<PropertyInfo> filterProperties = p.PropertyType.GetRuntimeProperties(); 

      foreach (PropertyInfo p1 in filterProperties) 
      { 
       **FilterAttribute filterAttr1 = p1.GetCustomAttribute<FilterAttribute>();**//But not this one, i get null 
+0

Если вы получили нуль, значит, это свойство не имеет атрибута, о котором вы просите. Проверьте 'p1.Name' и убедитесь, что это свойство, которое вы ожидали, иначе просто пропустите свойства без атрибута? – cdhowie

+1

cdhowie, который помог мне отслеживать проблему. У меня были некоторые свойства, унаследованные от базового слоя, который имеет атрибут dosent. Благодаря! – arif

+0

Что вы передаете для «p»? (PropertyInfo p, TestModel vm) –

ответ

0

GetCustomAttribute<T>() Если возвращается null то это означает, что пользовательский атрибут поставщика (свойство в данном случае) не имеет атрибут этого типа. Если вас интересуют только свойства с этим атрибутом, вы можете просто пропустить свойства без атрибута.

if (filterAttr1 == null) { 
    continue; 
}