gpt4 book ai didi

c# - 使用动态泛型类型参数创建泛型类的实例

转载 作者:行者123 更新时间:2023-11-30 21:41:04 27 4
gpt4 key购买 nike

我需要像这样创建一个泛型类的实例:

 Type T = Type.GetType(className).GetMethod(functionName).ReturnType;
var comparer = new MyComparer<T>(); // ERROR: "The type or namespace name 'T' could not be found"

我找到了这个 answer只有通过反射(reflection)才有可能做到这一点。但是使用反射我得到了我需要转换为我的泛型类型的对象。我试过这样

 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"

但得到同样的错误。如何解决?

这是一个完整的例子:

    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);
}

这个想法是做一个单元测试,它会调用一个带有参数的函数,并将其结果与正确的结果进行比较。但是我需要自定义比较器,所以我实现了 MyComparer,但由于编译器错误而无法使用。

public class MyComparer<T> : IEqualityComparer<T>
{
public bool Equals(T x, T y){/* some implementation*/}
}

最佳答案

我找到了非常简单的问题解决方案。无需将 object 转换为特定类型 T,只需使用 dynamic 关键字而不是转换

   Type myGeneric = typeof(MyComparer<>);
Type constructedClass = myGeneric.MakeGenericType(T);
object created = Activator.CreateInstance(constructedClass);
dynamic comparer = created; // No need to cast created object to T

然后我可以正常使用比较器来调用它的方法,例如:

   return comparer.Equals(myResultAsT, correctResultAsT);

根据 LueTm评论,可能可以再次使用反射并调用比较器方法,但这个解决方案看起来更容易。

关于c# - 使用动态泛型类型参数创建泛型类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43899490/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com