2016-09-27 4 views
3

Ich benutze eine Erweiterungsmethode eine DataRowField für nullGenerisches DataRow Erweiterung

public static string GetValue(this System.Data.DataRow Row, string Column) 
{ 
    if (Row[Column] == DBNull.Value) 
    { 
     return null; 
    } 
    else 
    { 
     return Row[Column].ToString(); 
    } 
} 

Nun überprüfen Ich frage mich, ob ich diese allgemeineren machen könnte. In meinem Fall ist der Rückgabetyp immer Zeichenfolge aber die Spalte könnte auch Int32 oder Datetime

So etwas wie

public static T GetValue<T>(this System.Data.DataRow Row, string Column, type Type) 
+3

Warum wollen Sie Zeichenfolge zurück, wenn es ein int oder Datetime ist? Verwenden Sie die ['DataRowExtensions.Field'-Methode] (https://msdn.microsoft.com/en-us/library/system.data.datarowextensions.field (v = vs.110) .aspx), die stark typisiert ist und unterstützt sogar Nullable-Typen. –

+0

Geben Sie ein 'Objekt' anstelle einer Zeichenfolge zurück. Ändern Sie auch Folgendes: if ((Objekt) Zeile [Spalte] == DBNull.Value). Dann müssen Sie den Zellenwert nicht in eine Zeichenfolge zurückgeben. – jdweng

Antwort

5
public static T value<T>(this DataRow row, string columnName, T defaultValue = default(T)) 
    => row[columnName] is T t ? t : defaultValue; 

oder für frühere C# Versionen sein:

public static T value<T>(this DataRow row, string columnName, T defaultValue = default(T)) 
{ 
    object o = row[columnName]; 
    if (o is T) return (T)o; 
    return defaultValue; 
} 

und Probe Anwendungen (Der zugrunde liegende Typ muss exakt übereinstimmen, da keine Konvertierung stattfindet):

int i0 = dr.value<int>("col");  // i0 = 0 if the underlying type is not int 

int i1 = dr.value("col", -1);  // i1 = -1 if the underlying type is not int 

Andere Alternativen ohne Erweiterung kann auf NULL festlegbaren Typen:

string s = dr["col"] as string;  // s = null if the underlying type is not string 

int? i = dr["col"] as int?;   // i = null if the underlying type is not int 

int i1 = dr["col"] as int? ?? -1; // i = -1 if the underlying type is not int 

Der Spaltenname Lookup ist langsamer, wenn der Fall nicht, because a faster case sensitive lookup is attempted first before the slower case insensitive search überein.

+0

tolle Antwort, danke – Toshi

+0

Wenn man einen robusteren Weg braucht, kann der 'Convert.ChangeType' anstelle eines Cast verwendet werden. –

0

Signatur Ihrer Methode wird als

public static T GetValue<T>(this System.Data.DataRow Row, string Column) 

In Else Teil folgt ändern Sie einfach den folgenden

return (T)Row[Column];