2017-03-29 2 views
0

Ich implementiere jetzt eine Funktion Register(), die andere Funktion ApiReturnFactory() ins Innere ruft.C# -Funktion, die Instanz mit unbekanntem generischen Typ zurückgibt

public ???? Register(string username) 
    { 
     var result = new AccountProcess().CreateAccount(username); 
     return ApiReturnFactory.CreateInstance(result); 
    } 

new AccountProcess().CreateAccount(username) gibt mir ein Objekt wie obj<WhateverType>.

ApiReturnFactory.CreateInstance(obj) gibt mir ein Objekt wie obj2<SameTypeWithWhateverType> zurück.

Meine Frage ist der Compiler bereits wissen, haben, welche Art ich in ApiReturnFactory.CreateInstance(obj) (IntelliSense tun) zurück, aber was soll ich in den Rückgabetyp ???? von Register(string username) angeben?

Ich möchte nicht einen generischen Typ für obj wie obj<string>, dies ist nicht sinnvoll, da der generische Typ möglicherweise nicht immer eine Zeichenfolge sein. Was ich will ist etwas wie obj<T>.

Vielen Dank im Voraus.

+0

haben Sie bei 'dynamic' Rückgabetyp geschaut? – Mauro

+2

"Da der generische Typ möglicherweise nicht immer eine Zeichenkette ist" - entweder ist dies falsch oder Ihr Codebeispiel fehlt etwas. 'result' muss einen klar definierten Typ haben, der zur Kompilierzeit bekannt ist. Wenn es * ist * dann ist der Typ fest und kann eingefügt werden. Wenn dies nicht der Fall ist, müssen andere Generika innerhalb der Funktion verwendet werden, die Sie nicht anzeigen. –

+0

Können Sie genaue Signaturen für CreateAccount- und CreateInstance-Methoden bereitstellen? – oryol

Antwort

4

eine Schnittstelle erstellen und Ihre generischen Typen von dieser Schnittstelle erbt und dieses Schnittstelle Objekt wieder zurück oder eine Basisklasse, was auch immer in Ihrem Anwendungsfall geeignet ist:

public interface IObject 
{ 

} 

public class GenericClass<SomeType> : IObject 
{ 


} 

und dann können Sie das Interface-Objekt zurückgeben:

public IObject Register(string username) 
{ 
    var obj = new AccountProcess().CreateAccount(username); 
    return ApiReturnFactory.CreateInstance(obj); 
} 
+0

Ich habe diese Methode versucht, aber scheint das zurückgegebene Objekt nicht die GenericClass-Eigenschaften in ItelliSense-Liste – mannok

+0

müssen Sie die gemeinsamen Mitglieder Ihres generischen Typs in der Schnittstelle zu definieren, über Referenz der Schnittstelle Typ –

+0

@Ehasn Saijad Sorry ich dachte Ich verstehe nicht, was du meinst. Bitte werfen Sie einen Blick auf "ApiReturn" und "IApiReturn" unter [http://imgur.com/a/PAcxX](http://imgur.com/a/PAcxX]. Mache ich es auf deine Art? – mannok

1
public obj2<T> Register<T>(string username) 
{ 
    var result = new AccountProcess().CreateAccount(username); 
    return (obj2<T>)ApiReturnFactory.CreateInstance(result); 
} 
Verwandte Themen