2010-08-09 66 views
18

我被卡住了。轉換動作<T>轉爲操作<object>

如何轉換C#中的Action<T> to an Action<Object>

問候 馬格努斯

+5

這個問題沒有道理,你不能創建一個動作,你必須指定一個類型。 – 2010-08-09 21:14:17

+1

猜測這些協變/逆變問題中的一個,否則答案將是'Action '。 – 2010-08-09 21:16:00

+2

除非T僅限於類,否則不能將開放泛型類型轉換爲Object。在代碼中,分配給Action 的Action 在T:class時是合法的。史蒂文,只是爲了澄清這一點不可能通過協變解決。 – Dykam 2010-08-09 21:19:23

回答

34

這裏就是你問什麼的樣品(類型檢查可以在最後一行添加到妥善處理無效的轉換異常更加人性化):

public Action<object> Convert<T>(Action<T> myActionT) 
{ 
    if (myActionT == null) return null; 
    else return new Action<object>(o => myActionT((T)o)); 
} 

可能是你可以給更多的細節這個任務雖然,因爲現在它看起來有點奇怪。

+0

謝謝我以後再測試一下。 – 2010-08-10 04:16:51

+0

它的工作原理。謝謝。 :-) – Fanda 2014-04-04 12:27:34

+1

哇哇。感謝兄弟:D – brian 2014-05-26 08:36:30

0

不知道你的轉換是什麼意思......動作是委託的泛型聲明...如果你想要一個動作代表,關於「對象」的作品,你會做這樣的事情:

var myAction = new Action<object>(obj=> ...); 
0

我假設你有這樣的事情:

void Foo(Action<object> action) { } 

Action<something> myaction; 

而且要轉換myaction這樣你就可以將它傳遞給富。

這是行不通的。

Foo可以將任何對象傳遞給源自對象的動作。但我的行爲只接受來自某物的物體。

0

我正在尋找一種方法來做到這一點今天偶然發現這篇文章。真的,我發現這樣做的唯一簡單方法是將行動<字符串>包含在新的動作<對象>內。在我的情況下,我將我的動作放入並行字典中,然後按類型檢索它們。實際上,我正在處理一個消息隊列,其中可以定義操作來處理具有特定類型輸入的消息。

var _actions = new ConcurrentDictionary<Type, Action<object>>(); 
Action<string> actionStr = s => Console.WriteLine(s); 
var actionObj = new Action<object>(obj => { var castObj = (V)Convert.ChangeType(obj, typeof(V)); actionStr(castObj); }); 
_actions.TryAdd(typeof(string), actionObj);