c# - 如何使用变量作为类型
问题描述
我想根据程序集(“OneOfMyAssemblies”)中的某种类型初始化一个统一容器。我想注册所有类型(类)继承一个特定的接口(“IInjectionMarker”)。我得到了它们,我创建了一个变量,但我不能将它们用作一种类型。问题出在:
unityContainer.RegisterType<interfaceName, typeName> (new InjectionConstructor("MyParameter"));
我收到错误“不能将变量用作类型”。我该如何解决这个问题?
var types = new List<Type>();
types.AddRange(Assembly.Load("OneOfMyAssemblies")
.GetTypeListImplementingTheInterface(typeof(IInjectionMarker)));
types.ForEach(h =>
{
Type typeName= Type.GetType(h.Name, true);
Type interfaceName = Type.GetType($"I{h.Name}", true);
unityContainer.RegisterType<interfaceName, typeName> (
new InjectionConstructor("MyParameter"));
});
解决方案
不幸的是,您不能将类型用于这样的泛型方法。
选项 1:使用非泛型方法
在简要检查文档后,我发现这RegisterType<TFrom, TTo>(IUnityContainer, InjectionMember[])
只是 IUnityContainer 的扩展方法,您可以使用 IUnityContainer 的一种方法,即RegisterType(Type, Type, String, ITypeLifetimeManager, InjectionMember[])
有关所有参数的更多详细信息,请查看链接到一些统一文档的文档
应该像这样工作:
Type toType = Type.GetType(h.Name, true);
Type fromType = Type.GetType($"I{h.Name}", true);
unityContainer.RegisterType(fromType, toType, null, null, new InjectionConstructor("MyParameter"));
选项 2:通过反射生成泛型方法
如果真的想使用通用扩展方法,我建议您参考这个答案,它将展示如何生成和调用这种方法: https ://stackoverflow.com/a/232621/5991722
推荐阅读
- json - 在 django 中检索 json 正文中的特定数据作为列表
- ajax - 对于我对 API 的 ajax 请求,如何将 Access-Control-Allow-Origin 设置为值 *?
- java - Java对参数化类型的原始引用不尊重参数
- shopify - Shopify:为“所有产品”页面选择替代模板
- python-3.x - 如何在绘图上画一条线?
- javascript - 获取带有数组图像的 json 对象返回意外的 json 结尾
- node.js - 有没有办法在 knex.js PostgreSQL 上使用“监听”?
- html-table - 在 Svelte 中从键列表对象创建一个表,例如 {col1: [cell, cell], col2: [cell, cell, cell]}
- python - bash 脚本遍历所有可能性并将结果保存到文件
- javascript - 为数组内的变量赋值