C#:泛型方法不调用特定方法重载

标签 c# generics mono unity3d polymorphism

我正在尝试在 C# 中创建一个通用方法,它将根据其主体中的参数数据类型调用不同的方法,然后处理它们的结果。我试图通过创建通用包装器方法来实现这一点,然后提供处理方法的多个重载 - 包括在没有特定重载可用时将使用的通用方法。

当我直接调用处理方法时,正确选择了合适的版本。但是,当我从包装器方法调用它时,它总是选择通用方法,即使我传递给它的特定数据类型有匹配的重载。

有什么方法可以调整代码以使其按照我需要的方式运行吗?或者我必须使用不同的方法。

我需要代码与 Mono 2.6 兼容。

using System;

class Program
{
    static void Func<T>(T val)
    {
        Console.WriteLine("Generic Func");
    }

    static void Func(int val)
    {
        Console.WriteLine("Int Func");
    }

    static void Func(string val)
    {
        Console.WriteLine("String Func");
    }

    static void FuncWrap<T>(T val)
    {
        Console.Write("Wrap: ");
        Func(val);
    }

    static void Main(string[] args)
    {
        Func(2);
        Func("Potato");
        Func(2.0);

        FuncWrap(2);
        FuncWrap("Potato");
        FuncWrap(2.0);

        Console.Read();
    }
}

最佳答案

Is there any way correct this behavior?

根据 C# 语言规范,这已经是正确的行为。在 FuncWrap 中调用的 Func 的重载通常在编译时确定,因此它不能选择不同的 Func 基于执行时类型的重载。

然而,改变行为的一种方法是使用动态类型:

static void FuncWrap<T>(T val)
{
    Console.Write("Wrap: ");
    dynamic x = val;
    Func(x);
}

现在将根据 x 值的实际 类型在执行时执行重载解析。这会产生性能成本,但应该按照您的意愿进行。

或者,您可以对重载的知识进行硬编码:

static void FuncWrap<T>(T val)
{
    Console.Write("Wrap: ");
    if (typeof(T) == typeof(string))
    {
        Func((string)(object)val);
    }
    else if (typeof(T) == typeof(int))
    {
        Func((int)(object)val);
    }
    else
    {
        Func(val);
    }
}

虽然这显然非常可怕。

关于C#:泛型方法不调用特定方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25685471/

相关文章:

c# - 在 Windows 下构建 mono 2.8

asp.net - 来自 Mono 2.10 的 XSP4 在 Windows 下不工作

c# - 使用 Mono.Cecil 注入(inject) generatedCodeAttribute

c# - 用于测试的 IHostingEnvironment

c# - 如何检查泛型类型参数是否可为空?

java - 从 Map 条目值中的 List<T> 转换为 Set<T>

java - <T>(尖括号)在 Java 中是什么意思?

c# - 减去日期并在数据库的不同列中保存值

c# - 如何自动启动窗口服务

c# - Postgresql 对列名和表名使用替代字符而不是引号