C#:当模板绑定到类型时动态绑定函数

时间:2011-05-03 17:00:43

标签: c# generics binding

给定一个模板类,只在三种不同的类型A,B和C上实例化,当模板绑定到一个类型时,有没有办法根据模板类型将外部函数调用绑定到另一个类?

e.g。

class template<T> {
    private printer myPrinter;
    Print(T obj) {myPrinter.Print(obj);
}

class printer {
    public Print(A obj){};
    public Print(B obj){};
    public Print(C obj){};
}

现在我的理解不起作用。

这让我选择了

1)编写三个不同的类而不是模板(使用代码三次,然后在编译时静态调用绑定)。

2)更改设计,使打印功能包含在对象A,B和C中,模板更改为

class template<T> where T : IPrintable {
    private printer myPrinter;
    Print(T obj) {obj.Print());
}

但这会导致调用函数的运行时动态分辨率和不合需要的设计,因为在我的情况下,Print函数在逻辑上更多地属于打印机。

3)使用动态关键字,这些内容如下:

class template<T> {
    private printer myPrinter;
    Print(T obj) {myPrinter.Print((dynamic)obj);
}

这里的绑定会发生在我想象的每个函数调用上。

所以,我真正想要的是一个解决方案,将函数保存在打印机类中(消除了两个),没有多次代码(消除1)并动态绑定Print函数而不是每次调用但在模板初始化(消除3)。

基本上我在想创建模板后,运行时环境应该知道每次调用时要调用哪个函数,并且每次调用函数时都不需要进行查找。

所以我的问题是,我的理解是正确的吗?当模板绑定到模板类型或更好的方法时,有没有办法动态绑定?那么使用动态类和多类的开销会是多少?

由于

1 个答案:

答案 0 :(得分:0)

使类Print中的方法printer成为通用方法。

class Printer
{
  public Print<T>(T obj) 
  {
    if(obj is A) DoLogicForTypeA();
    else if (obj is B) DoLogicforTypeB();
    else throw new IllegalArgumentException();
  }
}

调用模板通用:

Print(T obj) {myPrinter.Print<T>(obj);

您可以添加一些where-constraints以使其更好地工作。