如何从字符串创建实例并将其转换为接口类型?

时间:2018-12-12 06:51:06

标签: c# model-view-controller dynamic reflection

我有一个字符串,这是我的服务名称。我想从该字符串创建一个实例。我的容器是此代码中的简单注射器。代码是:

Type type = Type.GetType("mynamespace.IAppIssueDebitBatchService");
var instance =mycontainer.GetInstance<type>();

但是我不能将类型转换为接口。因为在mycontainer中,我需要这样的界面:

mycontainer.GetInstance<IAppIssueDebitBatchService>();

那怎么做? 然后,我要调用该接口的函数。我的意思是,我想动态地依赖于从db返回的服务名称,创建实例并调用我的所有接口都具有该方法名称的特定方法,如下所示:

instance.MyMethod();

谢谢。

1 个答案:

答案 0 :(得分:0)

要使用运行时未知的类型调用GetInstance<T>方法,必须使用MethodInfo.MakeGenericMethod,该方法允许使用仅在运行时已知的泛型类型参数来调用任何泛型方法。


在您的情况下(假设myContainer是名为MyContainer的类的实例),可以使用以下代码:

Type serviceType = Type.GetType("mynamespace.IAppIssueDebitBatchService");

MethodInfo methodInfo = typeof(MyContainer).GetMethod(nameof(MyContainer.GetInstance));
MethodInfo genericMethod = method.MakeGenericMethod(serviceType);
var result = genericMethod.Invoke(mycontainer, null);

其中genericMethod.Invoke(mycontainer, null)确实完成了您尝试使用mycontainer.GetInstance<serviceType>做的事情。


然后您可以将结果转换为所需的类型,例如

IAppIssueDebitBatchService service = (IAppIssueDebitBatchService) result;

IAppIssueDebitBatchService service = result as IAppIssueDebitBatchService;

如果强制转换不成功,则第一个抛出InvalidCastException(后者只是将null分配给service)。