我遇到了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}}。我怎么做到这一点。帮助。
答案 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中查看更多内容以供参考。