2011-03-05 53 views
1

編輯:將錯誤的術語裝箱更改爲轉換。C#在運行時動態地轉換通用對象

我有以下問題:

如果我創建類型Action或者Func鍵的新代表將澆鑄爲類型的委託。

var @delegate = Delegate.CreateDelegate(type, @object, methodInfo); 

但我需要一個泛型類權鑄造對象。

考慮下面的例子:

class Example<T> { 
    Type GenericType() { 
     return typeof(T); 
    } 
} 

static Example<T> Create<T>(T @delegate) { 
    return new Example<T>(); 
} 

Example.Create(@delegate).GenericType(); 

這將返回委託類型,因爲這是鑄造對象(@Delegate)的類型。

一種解決方案可能是投委託像這樣:

if(@delegate is Action) 
    Example.Create((Action)@delegate).GenericType(); 

但由於Delegate.CreateDelegate還可以創建行動或Func鍵代表,就不可能檢查所有的變化。

我不能改變泛型類,所以我必須施放委託。

我希望我能解釋我的問題。我不是以英語爲母語的人......

編輯:問題是typeof(T)沒有返回對象的「真實」類型。但我恐怕沒有解決辦法。

+6

你真的需要像這樣的代表工作嗎?也停止使用@delegate和@object。在我意識到你正在縮短保留名稱之前,我正盯着它一分鐘。 – Euphoric 2011-03-05 22:35:29

+0

這樣下來很糟糕只有值類型的值被裝箱,委託類型是一個引用類型,不太確定你想要做什麼,但是你用Delegate.DynamicInvoke()方法調用委託對象遲了一步 – 2011-03-05 22:38:49

+0

我沒有像C#中的「委託」或「對象」這樣的快捷方式,它打破了類應該是駱駝式的轉換,所以這就是我的復仇^^ 是的,我需要像這樣的代表: – jhlllnd 2011-03-05 22:46:16

回答

0

回答我自己的問題:這是不可能的。 :(

0

@delegate.GetType()有什麼問題來獲取代表的實際類型?

另外,一個附註:你濫用術語「拳擊」。

+0

我無法訪問@delegate變量,這在示例中是一個錯誤。 – jhlllnd 2011-03-05 22:38:28

+1

除非使用反射,否則不能使用類型對象動態轉換,這就是問題所在。 – Femaref 2011-03-05 22:38:37

+0

@delegate就像(Delegate)new Action(...),所以它被裝箱到Delegate。或不? – jhlllnd 2011-03-05 22:41:25

0

如果你能.NET 4.0,如果你再上面的作品你施放動態

Example.Create((dynamic)@delegate).GenericType(); 

如果你不能,那麼你就必須做一些反思和抽象使用。

abstract class Example{ 
     abstract Type GenericType(); 
    } 

    class Example<T>:Example { 
     override Type GenericType() { 
      return typeof(T); 
     } 
    } 

    static Example Create(Delegate @delegate) { 
     return (Example)Activator.CreateInstance(typeof(Example<>).MakeGenericType(new []{@delegate.GetType()})); 
    }