在我的示例中,我使用了Autofac(没有必要):
var r = builder.RegisterType<Helper>().As<IHelper>(); // usual using
我想做的就是能够像这样注册类型:
string name1 = "Helper";
string name2 = "IHelper";
var r = builder.RegisterType<GetTypeFromName(name1)>().As<GetTypeFromName(name2)>();
反射魔法有可能吗?
答案 0 :(得分:1)
您将必须创建一种机制来“弄清楚”要注册的具体类型以及如何公开它们(AutoFac中的As
部分)。以下是如何使用System.Type
注册的示例,因此缺少的部分是您自己获取System.Type
的地方。
// get your Type(s)
Type concreteType = typeof(Helper);
Type asType = typeof(IHelper);
// Autofac registration call
builder.RegisterType(concreteType).As(asType);
如您在上面的代码中看到的,您应该调用RegisterType
和As
方法的非通用版本。 (无论如何,通用版本实际上只是调用了这些。)
答案 1 :(得分:1)
通常,要解析类型名称,您不仅需要提供类名称,还需要提供更多信息。所以我猜答案是“不完全”。
将字符串映射到类型的方法是Type.GetType
,在此处记录:https://docs.microsoft.com/en-us/dotnet/api/system.type.gettype?view=netframework-4.7.2
如您所见,在真空中我们不能说"Helper"
或"IHelper"
就足够了。您可能可以使用名称空间限定的类名来获得。 (当然,Helper
使用“硬编码”语法的原因是,编译器可以利用using
语句来确定Helper
的含义。该选项不会GetType
试图在运行时理解字符串时无效。)
如果您可以提供自定义解析器,也许可以使其完全按照您的描述运行。
答案 2 :(得分:1)
如果能够为要注册的类型获取Type
对象,则可以使用RegisterType
方法的不同重载将其传递给Autofac,如下所示:
var type = Assembly.LoadFrom(path).GetType(typeName);
builder.RegisterType(type);