2016-08-02 7 views
2

Ich muss eine generische Methode erstellen, die einen beliebigen Typ zurückgibt.Einstellung Standardtyp auf generische Aufrufermethode C#

wie mein Code

//my callee method 
public T getVal<T>(string key) 
{ 
    string result = ConfigurationManager.AppSettings[key].ToString(); 
    return string.IsNullOrEmpty(result) ? (T)(object)result : default(T); 
} 

// and my caller's 
getval<string>("somekey"); 
getval<int>("somekey1"); 
getval<bool>("somekey2") 

der obigen Aufruf Arbeiten fein .. Aber Meine Forderung folgt, ist I gesetzt Standardtyp benötigen (zB: string) an den Angerufenen-Methode.

eg: getval("somekey"); // callee should consider T as string by default and returns string type. 
getval<int>("somekey2") //this is a normal call to the same callee which returns int type 
+0

Diese Methode fein funktioniert nicht: Sie 'NullReferenceException' oder' InvalidCastException' erhalten, wenn 'T' nicht' string' ist und 'Ergebnis 'ist null oder eine leere Zeichenfolge. Sie können nicht einfach eine Zeichenkette an "T" übertragen, Sie müssen sie konvertieren (parsen). Sie werden wahrscheinlich auch diese Null-oder-Leer-Prüfung invertieren wollen und überlegen, ob Generika in diesem Fall wirklich nützlich sind. –

Antwort

9

diese Überlastung Implementierung hinzu:

public string GetVal(string key) 
{ 
    return GetVal<string>(key); 
} 
+0

Danke an Lee für diesen Fix! Überlastung, nicht übersteuern XD – MichaelThePotato

+0

danke für schnelle Antwort. Aber ich muss dieselbe generische Methode verwenden, die String als Standard betrachten sollte, wenn ich nicht erwähne. – prathap

+1

Diese Überladung sorgt dafür! Wenn Sie einen Typ mit angeben, wird die generische Implementierung aufgerufen. Andernfalls wird diese Implementierung aufgerufen und die generische Implementierung mit String als T aufgerufen. Wenn Sie möchten, dass andere Logik verwendet wird, wenn kein Typ angegeben ist, ändern diese Überlastung. Nach meinem besten Wissen können Sie keinen Standard-T-Typ für generische Methoden festlegen, – MichaelThePotato