Criar instância da classe genérica com o parâmetro de tipo genérico dinâmico
Eu preciso criar uma instância de uma classe genérica como esta:
Type T = Type.GetType(className).GetMethod(functionName).ReturnType;
var comparer = new MyComparer<T>(); // ERROR: "The type or namespace name 'T' could not be found"
Eu achei istoresponda onde isso é possível apenas com reflexão. Mas, usando a reflexão, obtenho um objeto que preciso converter no meu tipo genérico. Eu tentei assim
Type myGeneric = typeof(MyComparer<>);
Type constructedClass = myGeneric.MakeGenericType();
object created = Activator.CreateInstance(constructedClass);
var comparer = (T)Convert.ChangeType(created, T);// ERROR: "The type or namespace name 'T' could not be found"
mas obtenha o mesmo erro. Como resolver isso?
Aqui está um exemplo completo:
public static bool Test(string className, string functionName, object[] parameters, object correctResult)
{
var method = Type.GetType(className).GetMethod(functionName);
Type T = method.ReturnType;
var myResult = method.Invoke(null, parameters);
dynamic myResultAsT = Convert.ChangeType(myResult, T);
dynamic correctResultAsT = Convert.ChangeType(correctResult, T);
var comparer = new MyComparer<T>(); // Problem is here!!!
return comparer.Equals(myResultAsT, correctResultAsT);
}
A idéia é fazer um teste de unidade que chame uma função com parâmetros e compare seu resultado com o resultado correto. Mas eu preciso de comparador personalizado, então eu implementeiMyComparer
que não posso usar devido a um erro do compilador.
public class MyComparer<T> : IEqualityComparer<T>
{
public bool Equals(T x, T y){/* some implementation*/}
}