加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何在运行时中实例化这个’带有泛型参数的类’

发布时间:2020-12-16 00:08:33 所属栏目:百科 来源:网络整理
导读:参见英文答案 Create instance of generic type?????????????????????????????????????10个 考虑以下代码行: classAclassB C; 我想通过使用System.Reflection在运行时创建C的实例.为此,我需要在运行时知道classA和classB的类型. 我知道如何获得classB的类型
参见英文答案 > Create instance of generic type?????????????????????????????????????10个
考虑以下代码行:

classA<classB> C;

我想通过使用System.Reflection在运行时创建C的实例.为此,我需要在运行时知道classA和classB的类型.

我知道如何获得classB的类型

Type classBType = AssemblyContaingClassB.GetType("namespace.classB");

Q1>如何使用此classBType获取classA的类型?

Q2>我知道要在运行时创建实例,我们调用以下代码行:

object C = Activator.CreateInstance(TypeName);

要创建C的实例,代码上面应使用什么TypeName?将足以创建此实例的classA类型

如果这个问题太基础,请提前致谢并道歉.我是c#的新手.

编辑:

问题是固定的.从p.s.w.g的答案来看,使用泛型参数获取类的类型存在问题.关于如何获得通用参数类型的解决方案可以在here找到.之后我就完成了p.s.w.g的答案建议及其工作.

解决方法

鉴于您的最新更新,似乎问题是加载类型classA<>在运行时.为了避免命名冲突,C#编译器生成一个名称,如SimpleClassName`N,其中N是泛型类型参数的数量,因此要获得classA<>通过反射键入,使用名称namespace.classA`1.之后,您只需使用 MakeGenericType方法:

var classAType = AssemblyContaingClassA.GetType("namespace.classA`1");
var classBType = AssemblyContaingClassB.GetType("namespace.classB");
var genericType = classAType.MakeGenericType(classBType);

object instance = Activator.CreateInstance(genericType);

当然,除非您必须在运行时加载类型,否则使用typeof运算符在编译时获取类型更容易,更安全:

var classAType = typeof(classA<>);
var classBType = typeof(classB);
var genericType = classAType.MakeGenericType(classBType);

object instance = Activator.CreateInstance(genericType);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读