簡體   English   中英

C#:如何將通用方法與“ out”變量一起使用

[英]C#: How to use generic method with “out” variable

我想創建一個簡單的泛型函數

void Assign<T>(out T result) 
{
  Type type = typeof(T);
  if (type.Name == "String")
  {
     // result = "hello";
  }
  else if (type.Name == "Int32")
  {
     // result = 100;
  } 
  else result = default(T);
}

用法:

int value;
string text;

Assign(value); // <<< should set value to 100
Assign(text); // <<< should set text to "hello"

我的問題是如何編程代碼來設置這些值。 注釋部分中缺少的代碼。

謝謝你的幫助。

看起來在這種情況下,您可能正在嘗試避免裝箱? 無需更多信息就很難說,但是對於此特定示例,僅使用方法重載會容易得多,並且可能不易出錯:

void Assign(out string value)
{
   //...
}

void Assign(out int value)
{
   //...
}

對於具體學習什么錯在這里的目的,你需要它鑄造的一般類型之前將值轉換為一個對象:

(T)(object)"hello world!";

哪個IMO非常討厭,應該是不得已的方法-當然不會使您的代碼更清晰。

每當您對通用參數進行類型檢查時,這都很好地表明了通用不是解決問題的正確方法。 進行通用參數類型檢查會使您的代碼更復雜,而不是更簡單。 它使一個方法根據類型負責不同的行為,而不是一系列易於更改而不會意外影響其他方法的單一方法。 請參閱單一責任原則

首先,這是一個非常糟糕的模式。 您不應該使用這種模式。 也許如果您描述您真正想要實現的目標,將會得到更好的答案。

下面的代碼可行,但是正如我所說的那樣編寫代碼是一個壞主意。

    void Assign<T>(out T result) 
    { 
        Type type = typeof(T); 
        if (type.Name == "String") 
        { result = (T) ((object)"hello"); } 
        else if (type.Name == "Int32") 
        { result = (T) ((object)100); } 
        else result = default(T); 
    }

和用法:

        int value;
        string text;

        Assign(out value);
        Assign(out text);
public T GetObject<T>(string val)
{
    T _object = default(T);
    _object = (T)Convert.ChangeType(val, typeof(T));
    return _object;
}

這是一種方法:

static void Assign<T>(out T result) { 
    Type type = typeof(T);
    if (type.Name == "String") {
        result = (T)Convert.ChangeType("hello", typeof(T));
    }
    else if (type.Name == "Int32") {
        result = (T)Convert.ChangeType(100, typeof(T));
    }
    else {
        result = default(T);
    }
}

但是這段代碼聞起來確實很糟糕,並且與泛型的觀點背道而馳(而不是使用重載方法)。 我希望這不會最終出現在生產代碼中,而只是為了啟發。

暫無
暫無

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

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