[英]Using C# generics to create a mapper method with different return types
我正在嘗試創建一種方法來將int映射到字符串,並將string映射到int。 我本來想用一種方法來完成此操作,但不確定是否可行。
我已經走了這么遠:
class MappingWithGenerics
{
[Test]
public void IntToString()
{
string actual = Map<int, string>(1);
Assert.AreEqual("1", actual);
}
[Test]
public void StringToInt()
{
int actual = Map<string, int>("1");
Assert.AreEqual(1, actual);
}
public TOut Map<Tin, TOut>(Tin element)
{
if(element.GetType() == typeof(int))
return element.ToString();
return Convert.ToInt32(element);
}
}
這會產生編譯錯誤。
無法將類型'int'隱式轉換為'TOut'
無法將類型'string'隱式轉換為'TOut'
知道如何實現Map方法嗎?
泛型適用於需要跨多種不同類型使用相同功能的情況。 在這種情況下,您要處理兩種特定類型,並且希望它們之間具有不同的功能。 泛型並不是您真正想要的,尤其是當您可以通過簡單的方法重載來做同樣的事情時:
class MappingWithoutGenerics
{
public string Map(int x)
{
return x.ToString();
}
public int Map(string s)
{
return Convert.ToInt32(s);
}
}
您的代碼無法編譯的原因是您在編寫通用方法時僅考慮了兩種特定類型。 您可以將其轉換為通用函數,並轉換為object
,但這不是一個好主意。
您可以使用Convert
類實現所需的功能,如下所示:
public static TOut Map<Tin, TOut>(Tin element) {
return (TOut)Convert.ChangeType(element, typeof(TOut));
}
您的測試方法將保持不變。 但是,該方法將能夠進行超出string
> int
和int
> string
轉換:您將能夠在Convert.ChangeType
方法支持的任何一對類型之間進行轉換。
您可以實現以下方法:
public TOut Map<Tin, TOut>(Tin element)
{
object outValue;
if(element.GetType() == typeof(int))
outValue = element.ToString();
else
outValue = Convert.ToInt32(element);
return (TOut)outValue;
}
但是我真的很好奇,為什么您需要這種方法。 我相信有更好的方法來解決您的更廣泛的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.