使用C#泛型创建具有不同返回类型的映射器方法

时间:2014-12-04 17:28:49

标签: c# generics

我正在尝试创建一个方法,将int映射到string,将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方法吗?

3 个答案:

答案 0 :(得分:5)

泛型适用于各种不同类型的相同功能。在这种情况下,您要处理两种特定类型,并且您希望它们之间具有不同的功能。泛型并不是你想要的,特别是当你可以用简单的方法重载做同样的事情时:

class MappingWithoutGenerics
{
    public string Map(int x)
    {
        return x.ToString();
    }

    public int Map(string s)
    {
        return Convert.ToInt32(s);
    }
}

答案 1 :(得分:1)

您的代码无法编译的原因是您编写的泛型方法只考虑了两种特定类型。您可以将其转换为通用函数并转换为object,但这不是一个好主意。

您可以使用Convert类实现所需的功能,如下所示:

public static TOut Map<Tin, TOut>(Tin element) {
    return (TOut)Convert.ChangeType(element, typeof(TOut));
}

您的测试方法无需更改即可运行。但是,该方法可以在string - &gt; intint - &gt; string之外进行转换:您将能够在支持的任何类型对之间进行转换通过Convert.ChangeType方法。

Demo.

答案 2 :(得分:0)

您可以实现以下方法:

    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;
    }

但我真的很想知道你为什么需要这样的方法。我确信有更好的方法可以解决您更广泛的问题。