Sonntag, Dezember 8, 2019

Runtime-Erstellung von generischen Func – <T>

Brauche ich, um die Methode zu implementieren:

object GetFactory(Type type);

Diese Methode zurückgeben muss, eine Func – <T> wo typeparam ‚T‘ ist der ‚Typ‘.

So, mein problem ist, dass ich nicht weiß, wie man ein Func<?> zur Laufzeit über Reflexion. Activator.CreateInstance funktioniert nicht, da gibt es keine Konstruktoren, die auf die Delegierten.

Irgendwelche Ideen?

InformationsquelleAutor Craig Wilson | 2009-03-18

3 Kommentare

  1. 27

    Verwenden Sie Delegate.CreateDelegate, D. H. von einem MethodInfo; unten, ich habe hart codiert, aber würden Sie verwenden eine gewisse Logik, oder Expression, um die tatsächliche Methode zur Erstellung von:

    using System;
    using System.Reflection;
    class Foo {}
    
    static class Program
    {
        static Func<T> GetFactory<T>()
        {
            return (Func<T>)GetFactory(typeof(T));
        }
        static object GetFactory(Type type)
        {
            Type funcType = typeof(Func<>).MakeGenericType(type);
            MethodInfo method = typeof(Program).GetMethod("CreateFoo",
                BindingFlags.NonPublic | BindingFlags.Static);
            return Delegate.CreateDelegate(funcType, method);
        }
        static Foo CreateFoo() { return new Foo(); }
        static void Main()
        {
            Func<Foo> factory = GetFactory<Foo>();
            Foo foo = factory();
        }
    }

    Für nicht-statische Methoden, es ist eine überlastung der Delegate.CreateDelegate akzeptiert, dass die Ziel-Instanz.

    • Mark, ich weiß wirklich nicht, was T ist. Wenn ich wüsste, was T ist, wäre dies einfach.
    • Du meinst innerhalb der nicht-generischen Methode? Ich werde zu aktualisieren…
    • Modifizierte ich die Frage besser zu meinem problem.
    • Nicht genau das, was ich brauchte , aber das schob mich auf dem richtigen Weg. Vielen Dank für Ihre Hilfe.
    • ’s war das beste was ich tun konnte, gegeben die verfügbaren Informationen…
    • Oooh, war das spielen mit der Reflexion den anderen Tag und fragte sich, ob es einen Weg gibt, um zu beschreiben, einen generischen Typ-definition im code, und ich weiß jetzt: List<>, was vermutlich können nur innerhalb typeof?
    • richtig, Sie einfach weglassen aller Art-args – zum Beispiel, KeyValuePair<,> statt KeyValuePair<TKey,TValue>

  2. 0

    Ich denke, der übliche Ansatz wäre, um die „dumme“ version der Sache, die Sie vortäuschen zu runtme, und geben Sie dann einen Helfer, der Erweiterung Methode um die Art-sichere version oben drauf.

    • So, dies ist in den Eingeweiden von einem IoC-container, und ich habe das Objekt zurückzugeben, als eine stark typisierte Abhängigkeiten, die nicht unbedingt wissen, dass das, was angefordert wurde, war eine Func<T> (es könnte sein, einen Uri oder eine Zeichenkette).

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...