2012-03-27 13 views
12

Ist es möglich, ähnliche Konstruktion zu schreiben?
Ich mag setzen, irgendwie, Standardwert für Argumente vom Typ T.Generische Methoden und optionale Argumente

private T GetNumericVal<T>(string sColName, T defVal = 0) 
    { 
     string sVal = GetStrVal(sColName); 
     T nRes; 
     if (!T.TryParse(sVal, out nRes)) 
      return defVal; 

     return nRes; 
    } 

Außerdem habe ich folgenden Link zu finden: Generic type conversion FROM string
Ich denke, muss dieser Code arbeitet

private T GetNumericVal<T>(string sColName, T defVal = default(T)) where T : IConvertible 
{ 
    string sVal = GetStrVal(sColName); 
    try 
    { 
     return (T)Convert.ChangeType(sVal, typeof(T)); 
    } 
    catch (FormatException) 
    { 
     return defVal; 
    }    
} 

Antwort

15

Ich habe das nicht versucht, aber ändern zu T defVal = default(T)

4

Wenn Sie wissen, dass T wird hav ea parameterlosen Konstruktor können Sie neue T() als solche verwendet werden:

private T GetNumericVal<T>(string sColName, T defVal = new T()) where T : new() 

Andernfalls Sie default (T)

private T GetNumericVal<T>(string sColName, T defVal = default(T)) 
4

die Frage zu beantworten, verwenden können, die den Standardwert

einstellen würde funktionieren
private T GetNumericVal<T>(string sColName, T defVal = default(T)) 
{ 
    string sVal = GetStrVal(sColName); 
    T nRes; 
    if (!T.TryParse(sVal, out nRes)) 
     return defVal; 

    return nRes; 
} 

Sie können jedoch die statische TryParse-Methode nicht aufrufen, da der Compiler keine Möglichkeit hat, den Typ T zu kennen, deklariert diese statische Methode.

+0

Ja, ich kann TryParse nicht anrufen. Aber vielleicht etwas ähnliches? Vielleicht fügen Sie dem Parameter type eine Einschränkung hinzu (ich meine 'wo: ...')? Wenn numerische Typen eine konvertierende Schnittstelle implementieren. – hardsky

+0

Die CLR hat kein Konzept von "virtuellen statischen Methoden", der Compiler kann keine statischen Methoden von einem Typ ableiten. Soweit ich weiß, gibt es dafür keine saubere Lösung. –

+0

http://stackoverflow.com/questions/196661/calling-a-static-method-on-a-generic-type-parameter für weitere Details –