我有一个具有不同属性的Upload类,我喜欢在这个类或其他属性中找到每个UploadObject属性。如何在Upload类中找到所有UploadObject?
class UploadObject
{
public string ID {get; set;}
//...
}
class PicUpload
{
UploadObject Pic {get; set;}
//...
}
class FileUpload
{
UploadObject File {get; set;}
//...
}
class Upload
{
//..
FileUpload File {get; set;}
List<PicUpload> Pics {get; set;}
//...
UploadObject Something {get; set}
}
编辑: 我正在寻找类似的功能:
public object[] FindProperties(object objectTree, Type targetType) {}
答案 0 :(得分:2)
typeof(Upload).GetProperties()
.Where(p => typeof(UploadObject).IsAssignableFrom(p.PropertyType));
将返回返回类型为UploadClass或继承类的所有属性。然后你就可以对它使用递归,并且在可能包含UploadObject的类型上有一个停止条件。停止条件可以是使用IsPrimitive
检查返回类型是否是基本类型(在Type
上可用)。
如果您只想要特定类型,可以将IsAssignableFrom替换为== typeof(UploadObject)
。
修改强>
这是我想到的想法。免责声明:我所做的唯一测试是编译它并针对一个场景运行它,但它有效,但它说明了这个想法。
public static T[] GetAllPropertyValuesForTypeinTree<T>(object rootObject)
{
var propertyInfos = rootObject.GetType().GetProperties();
var withCorrectPropertyType = propertyInfos
.Where(p => p.PropertyType == typeof(T)).ToList();
var withListsOfType = propertyInfos.Where(p =>
IsEnumerableOf<T>(p.PropertyType)).ToList();
var complexProperties = propertyInfos.Except(
withCorrectPropertyType.Concat(withListsOfType))
.Where(p => !p.PropertyType.IsPrimitive && !p.PropertyType.IsGenericType);
var complexValues = new List<T>();
foreach (var complexProperty in complexProperties)
{
complexValues.AddRange(GetAllPropertyValuesForTypeinTree<T>(
complexProperty.GetValue(rootObject, null)));
}
var listValues = withListsOfType.Select(p =>
(IEnumerable)p.GetValue(rootObject, null))
.SelectMany(p => p.OfType<T>());
var propertyValues = withCorrectPropertyType.Select(p =>
(T) p.GetValue(rootObject, null));
return propertyValues.Concat(listValues).Concat(complexValues).ToArray();
}
private static bool IsEnumerableOf<T>(Type type)
{
if (!typeof (IEnumerable).IsAssignableFrom(type))
return false;
return type.GetInterfaces().Any(interfaceType => interfaceType.IsGenericType
&& (interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>)
&& type.GetGenericArguments()[0] == typeof(T)))
|| type == typeof(IEnumerable<T>);
}
你可以用:
来称呼它var propVals = GetAllPropertyValuesForTypeinTree<UploadObject>(theInstance);
答案 1 :(得分:0)
你在找这样的东西吗?
typeof(UploadClass).GetProperties().Where(x => x.PropertyType == typeof(UploadObject));