2010-08-12 65 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。

相關問題