簡體   English   中英

將DataTable列類型傳遞給通用方法<T>

[英]Passing DataTable Column Type to generic method <T>

我有一個這樣聲明的方法

public static T GetValidatedValue<T>(string param)
{
   do something here and return object of type T...;
}

通常我這樣稱呼它var somnum = GetValidatedValue(“ 14”); 並期望sumNum為數字,或者如果傳遞的無效值為“ 0”

我現在的問題是我需要將datatabel列類型作為“ T”傳遞給此方法

就像是 :

dr[col] = GetValidatedValue <typeof(dr[col])>(dr[col].ToString());

這將無法編譯

它基本上是我在某個地方(甚至在此站點上)找到並經過修改即可根據需要工作的兩個(2)方法的組合

public static T GetValidatedValue<T>(string param)
{
    return TryParse<T>(param);
}

private static T TryParse<T>(string inValue)
{
    var converter = TypeDescriptor.GetConverter(typeof(T));

    try
    {
        return (T)converter.ConvertFromString(null, CultureInfo.InvariantCulture,     inValue);
    }
    catch
    {
        return default(T);
    }
}

誰能告訴我我做錯了什么...

KISS方法怎么樣:

static readonly Dictionary<Type, object> defaultMap = new Dictionary<Type, object>()
        {
            { typeof(DateTime), DateTime.MinValue },
            { typeof(Int32), 0},
            { typeof(String), ""}
            /* etc etc etc*/
        };

private static void SetDefault(Type type, ref object value)
{
    if(value == DBNull.Value || value == null)
        value = defaultMap[type];
}

然后,您只需調用它:

SetDefault(col.DataType, ref dr[col]);

泛型實際上僅在知道編譯時的類型時才有用,在這種情況下,您可以這樣調用方法:

GetValidatedValue<int>(dr[col].ToString());

但是,在我看來,您實際上在編譯時並不知道類型,因此泛型只會妨礙您的工作。 嘗試實現方法的非泛型版本,如下所示:

public static object GetValidatedValue(string param, Type type)
{
    return TryParse(param, type);
}

private static object TryParse(string inValue, Type type)
{
    var converter = TypeDescriptor.GetConverter(type);

    try
    {
        return converter.ConvertFromString(null, CultureInfo.InvariantCulture, inValue);
    }
    catch
    {
        return default(T);
    }
}

這樣,您可以這樣稱呼它:

GetValidatedValue<int>(dr[col].ToString(), dr[col].GetType());

(盡管我必須承認,將某些內容轉換為字符串然后再次將其轉換回其原始類型似乎是不必要的開銷。)

更新資料

現在我更了解你想要做什么,上面的方法是行不通的,因為dr[col]不會有任何的類型,如果是null ,這將有DbNull類型,如果是DbNull 除非您有其他方法來確定在該列中存儲哪種類型的數據,否則它將無法正常工作。 當然,如果您可以確定應該使用哪種數據類型,則獲取默認值將非常容易:

public static object GetValidatedValue(string param, Type type)
{
    return param == null || param == DBNull.Value ? Activator.CreateInstance(type); 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM