2013-12-04 1 views
0

Я столкнулся с проблемой о PropertyInfo .my кода здесьPropertyInfo не получает свойство строки

Type type = typeof(T); 
PropertyInfo propertyInfo = type.GetProperty(filterDescriptor.Member); 
if (propertyInfo != null && propertyInfo.PropertyType.FullName.ToLower() == "system.string") 
{ 
    isMemberStringType = true; 
    filterDescriptor.Value = filterDescriptor.Value ?? string.Empty; 
} 

Проблема является propertyInfo получением NULL если filterDescriptor.Member содержит значение как

abc.key
аЬса .Name

Но когда это кон tains Just Key and Name, Он работает, он получает system.string и выполняет if. Как я могу это сделать.Помощь.

+0

Не зная, что означает 'abc', нет действительного ответа. имя класса? имя интерфейса? имя цепи? – nawfal

ответ

0

MSDN documentation делает его очень ясно:

Параметры
имя
Тип: System.String

строка, содержащая имя общественной собственности, чтобы получить.

Ни один класс не может содержать свойство с точкой (.) По названию.
То, что вы пытаетесь достичь (я думаю), - проверить свойство child (например, ваш класс имеет свойство с именем abc, а класс этого свойства имеет свое собственное свойство с именем key).

Для этого вам необходимо использовать recursion.

public bool HasPropertyInPath(
    Type checkedType, 
    string propertyPath, 
    Type propertyType) 
{ 
    int dotIndex = propertyPath.IndexOf('.'); 
    if (dotIndex != -1) 
    { 
     PropertyInfo topPropertyInfo 
      = checkedType.GetProperty(propertyPath.Substring(0, dotIndex)); 

     if (topPropertyInfo == null) 
     { 
      return false; 
     } 

     return HasPropertyInPath(
      topPropertyInfo.PropertyType, 
      propertyPath.Substring(dotIndex + 1), 
      propertyType); 
    } 

    PropertyInfo propertyInfo = checkedType.GetProperty(propertyPath); 

    return (propertyInfo != null && propertyInfo.PropertyType == propertyType); 
} 

Затем вы можете использовать его как это:

if (HasPropertyInPath(typeof(T), filterDescriptor.Member, typeof(string)) 
{ 
    isMemberStringType = true; 
    filterDescriptor.Value = filterDescriptor.Value ?? string.Empty; 
} 


Приведенный выше код не проверял, но должны проверить детские свойства.

+0

Свойства класса действительно могут иметь '.' В своих именах, например, явно реализованные свойства. – nawfal

0

Это невозможно с помощью простого вызова GetProperty, поскольку он работает только для текущего уровня объекта. То, что вы хотите сделать, - это пересечь вложенные свойства. И вы должны помнить о лечении коллекций по-разному (потому что вы хотите увидеть их элементы свойств, а не свойство самой коллекции):

static System.Reflection.PropertyInfo GetProperty(Type type, string propertyPath) 
{ 
    System.Reflection.PropertyInfo result = null; 
    string[] pathSteps = propertyPath.Split('.'); 
    Type currentType = type; 
    for (int i = 0; i < pathSteps.Length; ++i) 
    { 
     string currentPathStep = pathSteps[i]; 
     result = currentType.GetProperty(currentPathStep); 
     if (result.PropertyType.IsArray) 
     { 
      currentType = result.PropertyType.GetElementType(); 
     } 
     else 
     { 
      currentType = result.PropertyType; 
     } 
    } 
    return result; 
} 

, а затем вы можете «запрос» объекты с «дорожками»:

PropertyInfo pi = GetProperty(c1.GetType(), "ArrayField1.Char"); 
PropertyInfo pi2 = GetProperty(c2.GetType(), "Color"); 

Подробнее см. В this answer.