【问题标题】:Resolution of overloads at runtime for generics解决泛型运行时的重载问题
【发布时间】:2012-08-15 21:43:51
【问题描述】:

在 C# 中是否可以将泛型传递给重载方法,并让它解析为方法的非泛型版本?例如:

class Program {
    static void Main(string[] args) {
        A a = new A();

        Process(a);
        Console.ReadLine();
    }

    static void Process<T>(T item) {
        Writer(item);
    }

    // Writer methods...

    static void Writer<T>(T item) {
        Console.WriteLine("Type: " + item.GetType());
        Console.WriteLine("You lose");
    }

    static void Writer(A item) {
        item.Write();
    }
}   

class A {
    public void Write() {
        Console.WriteLine("You found me!");
    }
}

此代码输出:

类型:Foo.A

你输了

我想看看:

你找到了我!

有没有办法做到这一点,或类似的东西?我正在使用 C# 4。

【问题讨论】:

  • 为什么不使用继承?
  • 我怀疑如果没有明确的演员或一些额外的代码,这是可能的。在您的Process&lt;T&gt; 中,item 是泛型类型T。编译器不可能发出对期望 A 作为类型的方法的调用。
  • @WesleyWiser,好吧,我基本上是在尝试使用它来调用采用List&lt;something&gt; 的方法...但我想如果我不能重载工作,我可以自己编写集合类,并为我想使用的每个something 继承它。
  • @Eric 所以你想为List&lt;A&gt; 做点什么,为List&lt;B&gt; 做点不同的事情?
  • 你可以创建一个 Process 的重载,它需要一个 A 虽然这并不能解决一般问题。

标签: c# c#-4.0 generics overloading


【解决方案1】:

您可以使用dynamic 将重载解决方案推迟到运行时:

static void Process<T>(T item)
{
    dynamic d = item;
    Writer(d);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多