2010-08-09 9 views
18

Ich stecke fest.Aktion <T> in Aktion umwandeln <object>

Wie konvertiere ich die Action<T> to an Action<Object> in C#?

Grüße Magnus

+5

Die Frage ergibt keinen Sinn, Sie können keine Aktion erstellen , Sie müssen einen Typ angeben. –

+1

Erraten diese eine dieser Kovarianz/Kontravarianz Fragen, sonst wäre die Antwort nur "Aktion ". –

+2

Sie können einen offenen generischen Typ nicht in ein Objekt umwandeln, es sei denn, T ist auf die Klasse beschränkt. Im Code ist die der Aktion zugewiesene Aktion zulässig, wenn T: class. Steven, nur um das zu klären, ist wahrscheinlich nicht durch Kovarianz lösbar. – Dykam

Antwort

34

Hier ist ein Beispiel, was man sich nur wünschen (Typprüfung kann in letzter Zeile hinzugefügt werden, um richtig ungültige Guss Ausnahme handhaben zu benutzerfreundlicheren):

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

Mai werden Sie weitere Details geben die Aufgabe aber, denn momentan sieht es ein bisschen komisch aus.

+0

Danke Ich werde es später testen. –

+0

Es funktioniert. Vielen Dank. :-) – Fanda

+1

wow wonderfull. Danke bro: D – brian

0

Nicht sicher, was Sie unter Umwandlung ... Aktion ist die allgemeine Erklärung eines Aktionsdelegate ... wenn Sie eine Aktion delegieren möchten, die auf ‚Objekt‘ funktioniert würden Sie tun so etwas wie :

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

ich nehme an, Sie so etwas wie dieses:

void Foo(Action<object> action) { } 

Action<something> myaction; 

Und konvertieren möchten myaction, so dass Sie es zu Foo passieren kann.

Das funktioniert nicht.

Foo kann jedes Objekt an die Aktion übergeben, deren Typ von Objekt abgeleitet ist. Aber myaction akzeptiert nur Objekte, die von etwas abgeleitet sind.

0

Ich war auf der Suche nach einem Weg, dies heute zu tun und stolperte über diesen Posten. Wirklich, der einzige einfache Weg, den ich fand, war es, die Aktion <string> innerhalb einer neuen Aktion <Objekt> zu wickeln. In meinem Fall habe ich meine Aktionen in ein Concurrent Dictionary verschoben und dann nach Typ sortiert. Effektiv verarbeitete ich eine Nachrichtenwarteschlange, in der Aktionen definiert werden konnten, um Nachrichten mit einer bestimmten Eingabe zu verarbeiten.

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); 
Verwandte Themen