如何判断一个属性是否为List <t>,其中T是自定义类型?</t>

时间:2013-11-10 21:48:08

标签: c# reflection

我有两个型号

public class Foo{
    public List<Bar> Bars {get; set;}
}
public class Bar{
    public string Name {get; set;}
}  

然后我有另一种看起来像这样的方法。

DoStuff<Foo, Bar>();
public void DoStuff<TModel, TCollection>(){

    foreach(var property in typeof(TModel).GetProperties())
    {
        if ( property.PropertyType.IsAssignableFrom(TCollection) )
        {
            // this is the property we need...
        }
    }
}

以上代码无效。如何判断模型中的属性是否为TCollection列表?

2 个答案:

答案 0 :(得分:1)

这取决于您想要照顾的场景。最基本的,您可以查看IsGenericTypeGetGenericTypeDefinition()==typeof(List<>)。然而!这在一些情况下失败了,特别是自定义子类等.BCL的大部分方法都是“它是IList(非泛型)并且它有非object索引器吗? “;即。

static Type GetListType(Type type)
{
    if (type == null) return null;

    if (!typeof(IList).IsAssignableFrom(type)) return null;

    var indexer = type.GetProperty("Item", new[] { typeof(int) });
    if (indexer == null || indexer.PropertyType == typeof(object)) return null;

    return indexer.PropertyType;
}

使用:

public void DoStuff<TModel, TCollection>()
{
    foreach (var property in typeof(TModel).GetProperties())
    {
        var itemType = GetListType(property.PropertyType);
        if(itemType == typeof(TCollection))
        {
            // this is the property we need
        }
    }
}

答案 1 :(得分:1)

这样的事情有帮助吗?

foreach (var propertyInfo in typeof (Foo).GetProperties())
{
    if (propertyInfo.PropertyType.IsGenericType)
    {
        var isAList = propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof (List<>);
        var isGenericOfTypeBar = propertyInfo.PropertyType.GetGenericArguments()[0] == typeof(Bar);
    }
}