[英]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.