我有两个型号
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列表?
答案 0 :(得分:1)
这取决于您想要照顾的场景。最基本的,您可以查看IsGenericType
和GetGenericTypeDefinition()==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);
}
}