繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM