反射将每个属性转换为列表<t> </t>

时间:2014-04-09 21:27:46

标签: c# generics reflection

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

您可以尝试使用&#34; dynamic&#34;而不是&#34; var&#34;并将属性保留为对象,然后它应该像往常一样调用List成员而不进行编译时检查。