我正在尝试使用Reflection循环遍历对象属性并将每个属性强制转换为List<T>
。
class MyObj
{
public List<A> As { get; set; }
public List<B> Bs { get; set; }
public List<C> Cs { get; set; }
public List<D> Ds { get; set; }
public List<E> Es { get; set; }
}
我有一个方法,它接受一个对象,我试图将每个属性的值转换为List<T>
,但它不起作用。
void ProcessObject(object o)
{
foreach (PropertyInfo propertyInfo in this.GetType().GetProperties())
{
Type propertyType = propertyInfo.PropertyType;
Type propertyListType;
if (TryListOfWhat(propertyType, out propertyListType))
{
var propertyValue = (List<propertyListType>)propertyInfo.GetValue(this);
}
}
}
public static bool TryListOfWhat(Type type, out Type innerType)
{
Contract.Requires(type != null);
var interfaceTest = new Func<Type, Type>(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>) ? i.GetGenericArguments().Single() : null);
innerType = interfaceTest(type);
if (innerType != null)
{
return true;
}
foreach (var i in type.GetInterfaces())
{
innerType = interfaceTest(i);
if (innerType != null)
{
return true;
}
}
return false;
}
现在我知道该属性是List<T>
,我的类型为T
,如何将属性对象值转换为List<T>
?
我创建了另一个问题来解释我在这里要实现的目标:https://stackoverflow.com/questions/22975430/serialize-deserialize-inmemorydatabase
答案 0 :(得分:0)
您可以尝试使用&#34; dynamic&#34;而不是&#34; var&#34;并将属性保留为对象,然后它应该像往常一样调用List成员而不进行编译时检查。