我正在嘗試撰寫一個用于存盤、處理、保存和加載資料的類。我希望當我最終完成它時,它將簡化并主要自動化組織大量欄位的程序,將它們保存到檔案中,然后從這些檔案中檢索它們。
我的第一個想法是使用動態,但我不喜歡一個動態的性能下降,并且原始形式的類有很多動態。我想我會消除所有這些,只使用泛型,這確實讓事情變得更順暢。它還減少了所需代碼的數量。但是,我遇到了一個新問題。我正在嘗試多載運算子以使值的操作更容易一些。
它是這樣設定的:
public class DataElement<T>
{
public T In;
public T Out;
}
這是一個極其簡化和淡化的版本,但對于我目前正在努力解決的問題已經足夠了。這是問題所在:
public static DataElement<T> operator (DataElement<T> d, T val)
{
object o = val;
object oo = d.Out;
if (typeof(T) == typeof(string))
{
string s = o.ToString();
s = oo.ToString();
oo = s;
}
else
{
if (typeof(T) == typeof(int))
{
int i = int.Parse(o.ToString());
i = int.Parse(oo.ToString());
oo = i;
}
else if (typeof(T) == typeof(float))
{
float f = float.Parse(o.ToString());
f = float.Parse(oo.ToString());
oo = f;
}
else if (typeof(T) == typeof(long))
{
long l = long.Parse(o.ToString());
l = long.Parse(oo.ToString());
oo = l;
}
else if (typeof(T) == typeof(char))
{
}
}
d.Out = (T)oo;
return d;
}
我什至不確定這是否會奏效。我還沒有測驗過。主要是因為不喜歡。所有這些 IF 陳述句。它又丑又笨重。理想的解決方案是使用 SWITCH 陳述句,但哦不。VS 告訴我,型別的 SWITCH 陳述句僅在絕對最新版本的 C# 中受支持。而且我想不出任何其他方法來做到這一點。如果我直接嘗試,像這樣:
d.Out = val;
VS 告訴我“運算子 ' =' 不能應用于 'T' 和 'T' 型別的運算元” 好的,然后。如何完成我想做的事情?當我將“val”設定為“int”而不是通用“T”時,它告訴我同樣的事情。有什么我想念的嗎?我在這里重新發明輪子嗎?
uj5u.com熱心網友回復:
如果您堅持使用舊版本,您可以像這樣將 T 轉換為 TOther (TOther)(object)o:
if (typeof(T) == typeof(int)) {
int i = (int)(object)o;
...
至于開關,有一個同樣丑陋的解決方案來打開型別的名稱。希望有人可以針對較舊的 c# 版本對此進行改進。
uj5u.com熱心網友回復:
這個問題的真正解決方案是使用泛型約束來限制T支持加法的型別。不幸的是,整型數字型別沒有通用介面,但有一些執行緒有很長的解決方法串列。
我的建議是將問題委托給呼叫者,即
public DataElement<T> Add(T val, Func<T, T, T> addMethod){
return new DataElement<T>{In = this.In, Out = addMethod(this.Out, val)};
}
請注意,這使用常規方法而不是運算子,因為運算子必須滿足某些特定規則。我也會非常小心地改變輸入物件,我通常希望像“添加”這樣的基本方法回傳一個新物件,而不是修改輸入物件。
但是,如果目標是
撰寫一個用于存盤、處理、保存和加載資料的類
然后我建議使用序列化庫,至少對于“存盤、保存和加載”部分。因為這些是為了將物件轉換為可以保存到磁盤或通過網路發送等的序列化形式。Json.Net是一種流行的替代方案,但還有許多其他替代方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/415120.html
標籤:
上一篇:僅使用名稱的Show的替代方案
下一篇:如何在泛型類的具體類中參考型別
