2016-08-11 85 views
1

我想從類型變量中獲取類型。例如:從類型變量中獲取實際類型

Type t = typeof(String); 
var result = SomeGenericMethod<t>(); 

發生在第二行的錯誤,因爲t不是type,它是一個變量。任何方式使它成爲一種類型?

+0

爲什麼你不能'SomeGenericMethod ()',如果這不是你的用例,那麼你需要提供如何實際使用它,因爲解決它的最好方法取決於你如何做。假設'var'將是't'的類型,那麼你真正想要的是't result = ...',這是一個完全不同的問題。 –

+0

@ScottChamberlain,看起來像一個例子......爲了舉例。青色,請說明是否是。 – Mafii

+0

我得到的類型作爲方法中的參數,然後我想將它傳遞給泛型方法。是的,這只是一個例子。 – Cyan

回答

4

不,你不能在編譯時知道Type對象的值,這是你需要做的,以便將Type對象用作實際類型。無論你在做什麼,需要使用Type都需要動態地這樣做,並且不需要在編譯時知道類型。

+1

要點是,泛型類型參數必須在編譯時已知。 +1 – Mafii

+1

編譯時需要知道它們,因爲它們是編譯時保護,而不是因爲它們是編譯過程的內在原因。在編譯時檢查泛型是一種(拯救生命)安全的事情,而不是純粹的要求。 – Max

7

要根據類型的通用的實例,你可以使用反射來獲取通用與您要使用的類型的實例,然後使用激活創建一個實例:

Type t = typeof (string); //the type within our generic 

//the type of the generic, without type arguments 
Type listType = typeof (List<>); 

//the type of the generic with the type arguments added 
Type generictype = listType.MakeGenericType(t); 

//creates an instance of the generic with the type arguments. 
var x = Activator.CreateInstance(generictype); 

請注意,x這裏將是一個object。要調用它的功能,例如.Sort(),您必須將其設置爲dynamic

請注意該代碼很難讀,寫,維護,推理,理解或愛。如果您有任何替代品需要使用這種結構,探索那些徹底

編輯:您還可以投射您從Activator收到的對象,如(IList)Activator.CreateInstance(genericType)。這將給你一些功能,而不必訴諸於動態。

+0

不錯和偷來自[這裏](http://stackoverflow.com/a/9860408/4558029) – lokusking

+0

@lokusking我不知道你想說什麼,雖然我注意到鏈接談到鑄造從Activator實例返回的對象。我會更新我的答案。 – Max

+0

它不是關於創建實例,而是調用泛型方法 – lokusking

2

醜陋的解決方法使用反射:

類與泛型方法

public class Dummy { 
     public string WhatEver<T>() { 
      return "Hello"; 
     }  
    } 

使用

var d = new Dummy(); 
Type t = typeof(string); 
var result = typeof(Dummy).GetMethod("WhatEver").MakeGenericMethod(t).Invoke(d, null); 

在類的實例看最大的解決方案