2011-12-30 23 views
0

我有以下代码:如何将具有类名称的字符串转换为Generic将接受的类?

var something = UnityContainer.Resolve<IService<Package>>(); 

这工作好,因为包是我定义和设置,并通过统一映射一类的名称。但是在我的应用程序中,我的课程以字符串参数进入该方法。这样的事情:

public void Update(string className) { 

var something = UnityContainer.Resolve<IService<Package>>(); 

有没有一种方法,我可以把className字符串,并在上面的泛型使用它就像一个类?

+0

如何正确使用类名?或者你如何期待它被使用? – 2011-12-30 13:57:55

+0

我的或任何其他答案是否帮助您标记为正确。如果您有自己的解决方案,请在此处添加。 – 2012-05-10 10:20:45

回答

0

有名为“MakeGenericType” Type类,与实例化方法,可以在类型传给你要使用像下面的通用参数:

public void Update(string className) 
    { 
     var targetType = Type.GetType(className); 
     var serviceType = typeof(IService<>); 
     var genericParam = serviceType.MakeGenericType(targetType); 
     var unityType = typeof(UnityContainer); 
     var resolve = unityType.GetMethod("Resolve"); 
     var targetMethod = resolve.MakeGenericMethod(genericParam); 
     var something = targetMethod.Invoke(null, new[] { genericParam }); 
     //... 
+0

这是给我以下编译时错误错误:错误没有过载的方法'解决'需要1个参数 – 2011-12-30 15:20:52

+0

对不起,我从来没有使用统一之前。我只是在摆动。尽管我的答案已更新为调用泛型方法。 – doogle 2011-12-30 16:07:35

0

你可以做像

Assembly asm = Assembly.GetExecutingAssembly(); 
var t = asm.GetType("ConsoleApplication1.Test"); 

其中ConsoleApplication1是assmebly命名该测试是类的名字

2

我从来没有使用UnityContainer,但我认为你可以解决一个组件通过一个类型作为参数。你可以做这样的事情:

Type packageType = Type.GetType(className); 
Type openGenericType = typeof(IService<>); 
Type myClosedType = openGenericType.MakeGenericType(packageType); 
var something = UnityContainer.Resolve(myClosedType); 
相关问题