我有一个通用类型:
class DictionaryComparer<TKey, TValue> : IEqualityComparer<IDictionary<TKey, TValue>>
还有一个工厂方法,它将(应该)为给定的字典类型创建这个类的一个实例。
private static IEqualityComparer<T> CreateDictionaryComparer<T>()
{
Type def = typeof(DictionaryComparer<,>);
Debug.Assert(typeof(T).IsGenericType);
Debug.Assert(typeof(T).GetGenericArguments().Length == 2);
Type t = def.MakeGenericType(typeof(T).GetGenericArguments());
return (IEqualityComparer<T>)Activator.CreateInstance(t);
}
去掉所有无关的东西——即使这段代码也会抛出同样的异常。
private static object CreateDictionaryComparer()
{
Type def = typeof(DictionaryComparer<,>);
Type t = def.MakeGenericType(new Type[] { typeof(String), typeof(object) });
return Activator.CreateInstance(t);
}
断言通过了,所以我知道这T
是通用的并且有两个通用参数。但是,该行MakeGenericType
除外:
提供的泛型参数的数量不等于泛型类型定义的数量。
参数名称:实例化
我过去做过这种事情,我一生都无法弄清楚为什么这在这种情况下不起作用。(加上我不得不谷歌arity)。