[英]c# Generics<T> / constraints question
考慮以下例程,它通過構建一些默認行為來簡化我的生活(例如,沒有空值,不解析“1,1,1”作為有效數字):
public static Double CvtToDouble(Object O)
{
if (O == null) return (Double)0;
if (O == System.DBNull) return (Double)0;
if (O is string) return Double.Parse((String)O,
System.Globalization.NumberStyles.Float);
return (T)O;
}
然后對所有num類型重復該例程。 我想通過將它們全部組合起來來節省打字和拼寫錯誤
public static T CvtTo<T>(Object O) : where T : "is one of Int32, Int16 ..."
通常的“where T:struct”約束在這里是不夠的,因為“return(T)0”語句對任意值類型無效。 似乎應該有一些方法來泛化它而不向后彎曲,但我沒有看到它。 我錯過了什么?
你不能這樣做。
.NET中的泛型不是模板,它們只編譯一次,因此必須在編譯時合法,而不是在調用時。
由於沒有where T : number
約束,或者沒有where T : op_add()
約束,你只能用泛型來做這個,你需要重載或運行時檢查才能做到這一點。
您可以嘗試在哪里T:IConvertible並更改您的最后一行以返回Convert.ToDouble(O)? 我很確定所有的值類型都支持該接口。
您可能需要考慮為每個或列出的類型包含擴展方法的靜態類,以便為每個目標類型提供CvtToDouble()擴展方法;
static class CvtToDoubleExtension
{
static double CvtToDouble(this int arg)
{
return (double)arg;
}
static double CvtToDouble(this string arg)
{
return double.Parse(arg);
}
// Etc....
}
它不像你想要的通用方法那樣整潔,但它只有1個類,然后是CvtToDouble方法,可用於所有你想要的類型。
string example = "3.1412";
double value = example.CvtToDouble();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.