社区首页 >问答首页 >使用动态泛型类型参数创建泛型类实例

使用动态泛型类型参数创建泛型类实例
EN

Stack Overflow用户
提问于 2017-05-10 09:48:18
回答 2查看 9.6K关注 0票数 5

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

代码语言:javascript
代码运行次数:0
复制
 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。但是使用反射,我得到了对象,我需要将其转换为泛型类型。我试过像这样

代码语言:javascript
代码运行次数:0
复制
 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"

但也有同样的错误。如何解决这个问题?

下面是一个完整的例子:

代码语言:javascript
代码运行次数:0
复制
    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,因为编译器错误而不能使用它。

代码语言:javascript
代码运行次数:0
复制
public class MyComparer<T> : IEqualityComparer<T>
{
    public bool Equals(T x, T y){/* some implementation*/}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-11 09:18:12

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

代码语言:javascript
代码运行次数:0
复制
   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

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

代码语言:javascript
代码运行次数:0
复制
   return comparer.Equals(myResultAsT, correctResultAsT);

根据LueTm注释,很可能再次使用反射并调用比较器方法,但是这个解决方案看起来要容易得多。

票数 6
EN

Stack Overflow用户

发布于 2017-05-10 10:10:56

看起来你就快到了

代码语言:javascript
代码运行次数:0
复制
// t is a variable, so make it lowercase. This is where some of the confusion comes from
Type t = Type.GetType(className).GetMethod(functionName).ReturnType;
Type myGeneric = typeof(IEqualityComparer<>);

// You need to provide the generic type to make it generic with
// You want IEqualityComparer<T>, so:
Type constructedClass = myGeneric.MakeGenericType(t); 

// Now create the object
object created = Activator.CreateInstance(constructedClass);

// This is tricky without more context...
// You could try this, but to tell you more I would need to know where you use
// the comparer instance. Are you using it in a LINQ query, or in a Sort()?
// If so just cast it to a IEqualityComparer<YourType>, and
// make YourType whaterver you need it to be in the list or the query...
var comparer = (IEqualityComparer<object>)created;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43899490

复制
相关文章
【Kotlin】泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )
将 泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 ,
韩曙亮
2023/03/30
2.9K0
【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )
将 泛型参数 T 放在 尖括号 <T> 中 , 该泛型参数放在 类名后 , 主构造函数之前 , 该泛型参数 T 是 类型占位符 ,
韩曙亮
2023/03/30
4.1K0
【Kotlin】泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )
泛型类、泛型方法、类型通配符的使用
       你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。
泰斗贤若如
2019/06/19
3.8K0
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 )
泛型作用 : 为 类 , 接口 , 方法 提供复用性 , 支持类型不确定的数据类型 ;
韩曙亮
2023/03/28
5.4K0
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
泛型 可以 简单理解为 参数化类型 , 主要作用在 类 , 方法 , 接口 上 ;
韩曙亮
2023/03/29
15.4K0
【Java 泛型】泛型简介 ( 泛型类 | 泛型方法 | 静态方法的泛型 | 泛型类与泛型方法完整示例 )
泛型接口,泛型类和泛型通配符
泛型的使用位置,除了最常见的约束集合元素,还可以使用在接口,类,方法上面。最本质的原因就是为了在使用接口,类,方法的时候,可以将类型作为参数,进行类型的参数传递。这样可以使程序的编写更加的灵活,在创建对象,调用方法的时候动态的指定类型,所以泛型也可以理解为类型的参数化。
用户5745563
2019/07/04
2.3K0
泛型接口,泛型类和泛型通配符
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
给.neter们整理了一份《.NET/C#面试手册》,目前大约4万字左右,初衷也很简单,就是希望在面试的时候能够帮助到大家,减轻大家的负担和节省时间。对于没有跳槽打算的也可以复习一下相关知识点,就当是查缺补漏!
全栈程序员站长
2022/09/14
2.6K0
C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托
Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例
首先告诉大家ArrayList就是泛型。那ArrayList能完成哪些想不到的功能呢?先看看下面这段代码:
用户7886150
2020/12/02
3.3K0
C#动态调用泛型类、泛型方法
      主程序加载另一个程序集,将其中的所有类取出,然后对这些类分别调用泛型类或泛型方法。控制台程序解决方案如下:
hbbliyong
2018/12/28
3K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
冷环渊
2021/11/29
3.5K0
Java进阶:【泛型】认识泛型,泛型方法,泛型类,泛型接口和通配符
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
泛型类用法 : 使用时先声明泛型 , 如果不声明泛型 , 则表示该类的泛型是 Object 类型 ;
韩曙亮
2023/03/29
10.2K0
【Java 泛型】泛型用法 ( 泛型类用法 | 泛型方法用法 | 泛型通配符 ? | 泛型安全检查 )
泛型类/泛型委托示例
using System; using System.Collections.Generic; using System.ComponentModel; using System.Text; using System.Windows.Forms; namespace DeletegateT {     public partial class Form1 : Form     {         public Form1()         {             Initiali
菩提树下的杨过
2018/01/22
1.5K0
【Kotlin】泛型 ③ ( 泛型 out 协变 | 泛型 in 逆变 | 泛型 invariant 不变 | 泛型逆变协变代码示例 | 使用 reified 关键字检查泛型参数类型 )
本章总结 : 使用了 泛型 out 协变 和 泛型 in 逆变 极大的提高了程序的扩展性 ;
韩曙亮
2023/03/30
1.8K0
【Kotlin】泛型 ③ ( 泛型 out 协变 | 泛型 in 逆变 | 泛型 invariant 不变 | 泛型逆变协变代码示例 | 使用 reified 关键字检查泛型参数类型 )
Dart中的泛型方法、泛型类、泛型接口
为了能在一个方法里实现传入什么数据类型就返回什么数据类型,可以利用泛型将方法写成下面这样:
越陌度阡
2020/12/10
3.8K0
Dart中的泛型方法、泛型类、泛型接口
Kotlin 泛型:类型参数约束
上一篇文章讲了 Kotlin 泛型:基本使用,接下来我们再进一步了解泛型使用相关的进阶知识。
Kkkiro
2023/02/24
2.3K0
C#里面的泛型(T),泛型类,泛型方法,泛型接口等简单解释
只是比较简单的解释,在实际使用中,如果遇到需要深入研究的场景,再翻阅相关资料深入研究下。
zls365
2020/08/19
4.1K0
TypeScript中泛型及泛型函数、泛型类、泛型接口,泛型约束,一文读懂
 最近在学TypeScript,然后整理了一下关于TypeScript中泛型的一些笔记。
痴心阿文
2022/11/21
2.8K0
Java 泛型示例 - 泛型方法,类,接口
如果您一直在使用Java Collections并使用版本 5 或更高版本,那么我确定您已经使用过它。
淡定的蜗牛
2019/10/25
2.6K0
泛型(泛型擦除)【java基础—-泛型】
Java泛型是J2 SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter),这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
全栈程序员站长
2022/11/02
2.6K0
泛型(泛型擦除)【java基础—-泛型】
点击加载更多

相似问题

泛型方法:使用参数实例化泛型类型。

12

泛型类使用泛型参数。

10

从动态类型创建泛型类的实例

30

泛型方法,泛型类型,泛型参数

38

将泛型类型的实例作为泛型类的动态实例上的参数传递

34
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文