我正在.net 中编写一个小的序列化库。目标是替代 XmlSerialize,但更易于配置,并且不会用属性弄乱模型。
我面临的问题是我需要 ICollection<T>
在遍历模型期间找到的每个类型。天真的方法是这样的:
var theType=myModel.GetType().GetGenericArguments()[0];
ICollection<T>
但它对派生自特定 T的类没有帮助。
public class MyClass:A,ICollection<B>{}
我尝试使用反射获取界面
var iCollectionInterface =
o.GetType().GetInterfaces()
.Where(i => i.IsGenericType)
.Select(i => i.GetGenericTypeDefinition())
.FirstOrDefault(i => i == typeof(ICollection<>));
but iCollectionInterface.GetGenericArguments()[0]
is just T
,不是B
因为它只描述了接口的定义,而不是它的用法。
有任何想法吗?我也需要它,IDictionary<TKey, TValue>
但这基本上是相同的问题,并且会有相同的解决方案。
谢谢!
编辑
谢谢大家,这是我最终的结果:
public static Type GetTypeParameter(object o, Type typeToSearch, int argumentNumber)
{
return o.GetType()
.GetInterfaces()
.Where(i => i.IsGenericType)
.Where(i => i.GetGenericTypeDefinition() == typeToSearch)
.Select(t => t.GetGenericArguments()[argumentNumber])
.FirstOrDefault();
}