2017-01-03 4 views
0

Ich versuche, die Convert-Methode für Funktionen sowie Aktionen zu verwenden, so dass ich vermeiden kann, doppelte Methoden zu schreiben Delegaten von Func-Typ. Konvertieren Methode kommt aus Convert Action<T> to Action<object>Dynamic konvertieren Func in entsprechende Aktion

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var program = new Program(); 
     var mi = program.GetType().GetMethod("Function", BindingFlags.Instance | BindingFlags.Public); 
     // Can be any version of Func 
     var funcType = typeof(Func<int, int>); 
     // Create action delegate somehow instead 
     var del = mi.CreateDelegate(funcType, null); 
     // Or dynamically convert the Func to a corresponding Action type (in this case Action<int>) 
    } 

    // Or find a way to pass it in as a parameter here 
    public Action<object> Convert<T>(Action<T> action) 
    { 
     return o => action((T)o); 
    } 

    public int Function(int five) 
    { 
     return five; 
    } 
} 
+0

Was ist falsch an Ihrem Code? Funktioniert das nicht so, wie Sie es erwarten? – dasblinkenlight

+0

Aktion hat keine Rückgabetyp –

+0

Es gibt nichts falsch mit meinem Code, es ist geschrieben, um das Verständnis zu verbessern. Ich möchte nur eine Func-Variable dynamisch in die entsprechende Action-Variable konvertieren. – Martin

Antwort

0

Ich denke, man für so etwas suchen:

public static Action<T1> IgnoreResult<T1,T2>(Func<T1,T2> func) 
{ 
    return x => func(x); 
} 

Aber für alle Varianten von Func<T1,T2....>

ich denke, das würde funktionieren:

public static Action<TR> IgnoreResult<TR>(Delegate f) 
{ 
    return x => f.DynamicInvoke(x); 
} 

Mit Verwendung:

var action = IgnoreResult<int>(new Func<int,int>(program.Function)); 
action(5); 

Sie werden nicht in der Lage sein, es zu bekommen, um die Parameter ableiten und Rückgabetyp ohne kopieren und einfügen und das erste Beispiel für alle Varianten von Action<T1...> und Func<T1,T2...>.

+0

1. Lösung: Wie ich in meiner Frage erwähnte, ist mein Ziel, nur eine Methode für Action und Func zu haben, die uns zu führt. 2. Lösung: Sie erstellen einen Delegaten, der DynamicInvoke aufruft, das 30 mal langsamer ist als direkt aufrufen. – Martin

+0

Richtig, also wollen Sie das Beste aus beiden Welten =) Das kann getan werden, aber ist fiddlier, ich werde zurück zu Ihnen – Stuart

+0

Ich sollte Ihnen sagen, Sie können nicht dynamische Schlüsselwort oder Ausdruck Bäume verwenden. Unity unterstützt keine dynamischen und Ausdrucksbäume werden nur in Version 5.5.0 und höher unterstützt. LambdaExpression.Compile hat eine so schlechte Leistung, dass Sie den Delegierten Millionen Male aufrufen müssen, um die Initialisierungskosten zurückzubekommen. – Martin

Verwandte Themen