【发布时间】:2020-08-09 19:53:29
【问题描述】:
我正在尝试获取包含有关通用类(程序集、类名、类型参数名)的数据的 JSON 文件,并动态加载和实例化指定的类。如果我使用接口作为类型参数,我可以做到这一点。但是,实现细节不允许我走这条路,所以我需要使用特定的类型参数类。
到目前为止,我有以下代码:
var ci = Invoke.GetClassRef(@"D:\ROCT\Debug\x64 Core\Common Complex Functions.dll", "Namespace.Class");
Type[] typeArgs = { typeof(DoubleABCAry), typeof(FloatABCAry), typeof(Search3Range), typeof(object) };
var _model = ci.GetType().MakeGenericType(typeArgs);
var model = Activator.CreateInstance(_model) as ComplexBaseModel<IModelInput, IModelIOBase, ISearchDimension, object>;
model.Validate();
第 1 行:加载程序集和类。没问题。
第 2 行:列出我需要通过 string[] 指定名称的类型。
第 4 行:DoubleABCAry 实现 IModelInput; FloatABCAry 实现 IModelIOBase 等
第 4 行将对象转换为其基本定义(如图所示),这不是我想要的。我要RGB255ToCIELAB : ComplexBaseModel<DoubleABCAry, FloatABCAry, Search3Range, object>。
第 5 行表明该类已被正确理解。但是,该类显然是在实现接口,而不是我需要的特定类型。
有没有办法实现这两个目标:
- 使用字符串名称来指定每个类型参数。
- 最终将
model强类型化为解释?
我知道动态编译代码可以实现,但这是我最后的手段。
我正在使用 C# 9 预览版。
【问题讨论】:
-
为什么不能投到
ComplexBaseModel<DoubleABCAry, FloatABCAry, Search3Range, object>? -
如果我能施展它,我就不需要去这个麻烦了。我需要对演员表进行硬编码,这意味着我不需要根据字符串动态加载它。
-
那么也只需动态调用您的方法,不要使用您使用的安全转换运算符进行转换?
-
我不确定我是否 100% 关注。只有正确的类包含所需的方法,由于方法签名各不相同,因此无法通过接口实现。所以,我必须有正确的类型。我继续用谷歌搜索,发现不可能做我想做的事,因为 C# 无法将对象声明为特定类型(没有强制转换,如前所述,这意味着我不需要动态代码) .除非你知道怎么做并且可以举个例子?
标签: c# generics reflection activator