У меня есть общий тип:
class DictionaryComparer<TKey, TValue> : IEqualityComparer<IDictionary<TKey, TValue>>
И метод factory, который будет (должен) создавать экземпляр этого класса для данного типа словаря.
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);
}
Передача Asserts, поэтому я знаю, что T
является общим и имеет два общих аргумента. Строка с MakeGenericType
однако исключает:
Число предоставленных общих аргументов не равно арности определения общего типа.
Имя параметра: экземпляр
Я делал это в прошлом, и для меня жизнь не может понять, почему это не работает в этом случае. (плюс мне пришлось в Google arity).