У меня есть универсальный тип:
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 ).