2011-11-24 38 views
2

有沒有一種方法可以調用只有在運行時才知道類型的泛型函數?C#更簡單的運行時泛型

我試着這樣做:

static void bar() 
    { 
     object b = 6; 
     string c = foo<typeof(b)>(); 
    } 

    static string foo<T>() 
    { 
     return typeof (T).Name; 
    } 

基本上我想只在運行時類型參數決定,但我打電話的功能取決於類型參數。

而且我知道這可以用反射來完成......但它不是最好的解決問題的方法...


我有點期待在C#中的動態功能...


我扭動着兩個班的第一個之間的橋樑基本上是一棵大樹與不同類型的對象(通過接口複合),另一個是一個不大不小的「超級先生」的。 晚飯遊客接受鍵值dictioneries映射類型的對象,它看起來像: dic.Add(對象的值)

和T不一定是值的類型......很多時候它不是」的... 我知道它寫得不好,但我不能修復它... 我可以解決它,但只在運行時...

我已經與思考做的,但如果有一個更好的方式做它沒有他們我會很樂意學習...

謝謝

回答

1

這是一個黑客位,但你可以得到dynamic通過像做反射爲你工作,

class Program 
{ 
    static void Main(string[] args) 
    { 
     var b = 6; 
     var t = (dynamic)new T(); 
     var n = t.Foo(b); 
    } 

    class T 
    { 
     public string Foo<T>(T a) 
     { 
      return typeof(T).Name; 
     } 
    } 
} 

這裏的動態調用將提取的b類型和使用它作爲一個類型參數Foo()

+0

+1我沒有找到一種方法來做到這一點使用動態。 事情是,即時通訊沒有傳遞類型T的參數給我的foo函數......有沒有辦法用動態來解決這個問題? –

+0

不需要。如果您實際上沒有將b作爲參數傳遞,則需要反射。如果您提供了更多關於您真正想要做什麼的細節,那麼爲您提供解決方案會更容易。上面的類型(b).Name很容易做到這一點,所以顯然不是你在做什麼。 – chuckj

+0

編輯我的問題... –

0

Saly refelction是解決問題的方法,不管它好不好在這裏都沒有關係。這是運行時設計的機制來實現這一點。由於沒有參數或泛型可以用作輸入,這是實現它的唯一方法 - 它也是沒有意義的。如:你的例子不好。因爲在這個例子中,類型是硬編碼的。

如果其中b存在的方法具有b作爲泛型參數,則類型可用於傳遞給foo。如果沒有 - 反思是一條路,儘管語法看起來很笨拙。但只有一次。

+0

當然,我並不真正知道b在運行時的類型...這就是爲什麼我將int轉換爲對象... 我認爲反射在這裏是一個非常糟糕的解決方案......醜陋和不必要...泛型函數的類型只是另一種參數,由運行時相應處理。 –

0

我相信這是唯一的出路:

var foo = typeof(Foo<>).MakeGenericType(typeof (bar)); 
+0

富是一個功能不是一個類。你不能這樣做...... –

+0

是的,在這個問題上,你是對的。我敲了一個快速測試,其中Foo 是一個班級,我的不好。 –

0

您可以設置一類需要一個類型參數的可以在這個類的方法來使用運行時間。

public class GenericClass<T>() 
{ 
    ICommonInterface TheObject; 

    public GenericClass(T theObject) 
    { 
     TheObject = theObject; 
    } 


    public string GetName() 
    { 
     return TheObject.Name; 
    } 
} 

但是,如果股價接口傳遞的類型,以便讓他們之間的共同特性,這是唯一真正有用的。在你的例子中,依賴於你想要訪問特定屬性的類型,relection似乎是答案。

+0

我不控制我收到的對象的類型,也不調用通用函數。和一個通用的界面不會幫助...我使用System.Type.Name,來演示泛型類im調用實際上做了一些與我傳遞給它的類型。 –

1

如果您使用的是.NET 4,則可以使用dynamic關鍵字。總之,變量的類型將在運行時解析,因此它是一個超類型的類型;)您可以閱讀文章here或閱讀MSDN documentation

+0

typeof()是一個運算符,返回一個System.Type,它有一個名爲「Name」的屬性...這只是一個示例,證明我想在運行時接受正確的類型。 。 –

+0

我剛剛編輯過我的帖子...我的回答太快 –