Propertyinfo没有得到字符串的属性

时间:2013-12-04 11:56:21

标签: c# c#-4.0 reflection propertyinfo

我遇到了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得到Key and Name
  

abc.key
  abc.Name

但是当它包含Just system.string时,它会起作用,它会得到if并执行{{1}}。我怎么做到这一点。帮助。

2 个答案:

答案 0 :(得分:0)

MSDN documentation非常清楚:

  

<强>参数
  名称
  键入:System.String

     

包含要获取的公共属性名称的字符串。

任何类都不能包含名称中包含点(。)的属性 您想要实现的目标(我认为)是检查子属性(例如,您的类具有名为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;
}


以上代码未经过测试,但应检查儿童属性。

答案 1 :(得分: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中查看更多内容以供参考。