2009-06-25 5 views
2

Ich frage mich, ob ich einen grundlegenden IoC-Container aktualisieren kann, die ich benutze, um Lazy Load zu unterstützen. Wenn ich also IFoo registriert habe, möchte ich, dass der IoC-Container weiß, wie die beiden folgenden Abhängigkeiten erfüllt werden: Der erste ist der Standard, wie IoC-Container funktionieren, während der zweite einen einfachen Delegaten zurückgibt, der in den Container eines IFoo aufruft wenn es aufgerufen wird).Wie erkennen, ob ein Typ ist ein Func <T> und erhalten Sie den Typ der T

public Bar(IFoo x) 

public Bar2(Func<IFoo> lazyFoo) 

Das Problem kommt, wenn ich versuche, den Code zu schreiben, der dies tatsächlich tun wird. Gibt es eine Syntax, die den folgenden Pseudocode kompilieren lässt?

public T Resolve<T>() 
{ 
    if (T is Func<X>) 
     return (T)() => Resolve(typeof(X)); 
    return (T)Resolve(typeof(T)); 
} 

Oder meine Frage anders gesagt, wenn ich eine Art T, wie haben kann ich erkennen, ob es sich um eine Instanz von Func<X> ist, und wenn ja, was ist die Art von X?

Antwort

3

werfen Sie einen Blick auf diese Frage von heute Morgen - vielleicht geben Ihnen einen guten Start - C# generic list <T> how to get the type of T?

+0

Tatsächlich ersetzen 'list' mit' Func' und fertig ... –

+0

ja, wie diese es für mich tun sieht. Danke Jetzt habe ich ein Problem, dass der Compiler nicht lassen Sie mich von () => Resolve (theArgumentType) zurück auf die ursprüngliche T (auch wenn ich versuche, zuerst zum Objekt zu werfen). "Kann Lambda-Ausdruck nicht in Typ" T "umwandeln, weil es kein Delegattyp ist." –

0

In Antwort auf die Frage in den Kommentar, müssen Sie den Lambda-Ausdruck aufrufen, ist es nicht geworfen.

+0

Ich möchte ihn noch nicht aufrufen. Ich möchte die Funktion selbst zurückgeben, damit der Aufrufer sie aufrufen kann, wenn sie bereit für –

+0

sind Dann müssen Sie es in Func umwandeln. – SLaks

+0

Ich missverstanden; siehe zweite Antwort. – SLaks

1

Ich habe Ihre Frage missverstanden.

Es ist unmöglich, dies in einer Funktion so zu tun, wie Sie es versuchen, da der Compiler einen Delegattyp haben muss, um das Lambda zum Zeitpunkt der Kompilierung zu erstellen.

Dies sollte jedoch funktionieren.

public T Resolve<T>() 
{ 
    return (T)Resolve(typeof(T)); 
} 

public Func<T> LazyResolve<T>() 
{ 
    return() => Resolve<T>(); 
} 
+0

ok ich denke ich verstehe warum es nicht möglich ist. Schade, denn es wäre ein nettes Feature für einen IoC-Container. –

Verwandte Themen