簡體   English   中英

如何在 C# 中使用帶有 Generics 的重載運算符?

[英]How does one use overloaded operators with Generics in C#?

我正在嘗試編寫一個 class 來存儲、處理、保存和加載數據。 我希望當我最終完成它時,它將簡化並主要自動化組織大量字段的過程,將它們保存到文件中,然后從這些文件中檢索它們。

我的第一個想法是使用動態,但我不喜歡一個動態的性能下降,而原始形式的 class 有很多動態。 我想我會消除所有這些,只使用 generics,這確實讓事情變得更順暢了。 它還減少了所需代碼的數量。 但是,我遇到了一個新問題。 我正在嘗試重載運算符以使值的操作更容易一些。

它是這樣設置的:

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”時,它告訴我同樣的事情。 有什么我想念的嗎? 我在這里重新發明輪子嗎?

如果您堅持使用舊版本,您可以像這樣將 T 轉換為 TOther: (TOther)(object)o

if (typeof(T) == typeof(int)) {
    int i = (int)(object)o;
    ...

這個問題的真正解決方案是使用泛型約束將T限制為支持加法的類型。 不幸的是,整型數字類型沒有通用接口,但有一些線程有很長的解決方法列表

我的建議是將問題委托給調用者,即

public DataElement<T> Add(T val, Func<T, T, T> addMethod){
       return new DataElement<T>{In = this.In, Out = addMethod(this.Out, val)};
}

請注意,這使用常規方法而不是運算符,因為運算符必須滿足某些特定規則。 我也會非常小心地改變輸入對象,我通常希望像“add”這樣的基本方法返回一個新的 object,而不是修改輸入對象。

但是,如果目標是

編寫一個 class 用於存儲、處理、保存和加載數據

然后我建議使用序列化庫,至少對於“存儲、保存和加載”部分。 因為這些是為了將對象轉換為可以保存到磁盤或通過網絡發送等的序列化形式。Json.Net是一種流行的替代方案,但還有許多其他替代方案。

暫無
暫無

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

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