1

我有两个模型

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 列表?

4

2 回答 2

1

这取决于您要满足哪些场景。最基本的,您可以检查IsGenericTypeGetGenericTypeDefinition()==typeof(List<>)。然而!这在少数情况下会失败,特别是自定义子类等。大部分 BCL 采用的方法是“它是IList(非泛型的)并且它有非object索引器吗?”;IE

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
        }
    }
}
于 2013-11-10T22:02:28.773 回答
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);
    }
}
于 2013-11-10T22:03:47.157 回答