2010-08-12 63 views

回答

7

像th一样是,使用Type.MakeGenericType

Type arg = Type.GetType(s); 
Type definition = typeof(IRepo<>); 
Type concrete = definition.MakeGenericType(arg); 

注意Type.GetType(string)自带的几个注意事项:

  • 您需要指定类型的全名,包括名字空间
  • 如果你想从一个类型除了mscorlib或调用程序集以外的程序集,您必须包含程序集名称
  • 如果您包含程序集名称并且它是强类型的,则需要包含版本的完整程序集名称等
+2

还有几点: 如果知道类型存在于哪个程序集中,则可以使用Assembly.GetType,它应该能够解析完全限定的类型名称,而不将程序集信息附加到类型字符串。如果你所有的都是“Foo”,那么AppDomain.CurrentDomain.GetAssemblies()。SelectMany(a => a.GetTypes())。Single(t => t.Name ==“Foo”)或类似的你唯一的选择,但这是脆弱和风险。 – Ani 2010-08-13 05:10:42

4
Type t = typeof (IRepo<>).MakeGenericType(Type.GetType(s)); 
1

你可以做到以下几点:

var someTypeName = "Foo"; 
var someType = Type.GetType("Namespace.To." + someTypeName); 
typeof(IRepo<>).MakeGenericType(someType); 

你首先需要获得的FooType,然后可以传递到Type.MakeGenericType。

相关问题