如何根据new()调用泛型方法

时间:2016-08-14 09:06:04

标签: c# generics constraints

像这样。

class C1<T> : I1<T> where T:class{ 
  void M1() {}
}
class C2<T> : I1<T> where T:class,new(){
  void M2() {}
  void irrelevant_method{ ... new T(); ... }
}
class C3<T> where T:class {
  void M3(I1<T> x){
    // how to call M1 or M2?
    if (x is C1<T>) (x as C1<T>).M1();
    else if (x is C2<T>) (x as C2<T>).M2(); // error
  }
}

它不编译 - 我们知道编译器没有的东西。如果xC2,我们知道它有new()约束,但我们无法“提升”x,因为C3本身没有new()

不,我不能只添加new()。我真的必须处理没有默认ctor的类。

有什么想法吗?

编辑:添加了使用新T()的无关方法,但与问题无关。

虽然问题是重复,但事实证明答案是一样的。摆脱new()约束并在运行时使用Activator.CreateInstance<T>()。感谢您的链接。

1 个答案:

答案 0 :(得分:-1)

可能你应该使用这样的想法:

interface I1<T>
    {
        void Some ();
    }

    class C1<T> : I1<T> where T:class{ 
        public void M1() {}

        public void Some()
        {
        }
    }
    class C2<T> : I1<T> where T:class{
        public void M2() {}
        public void Some()
        {
        }
    }
    class C3<T> where T:class {
        void M3(I1<T> x){
            if (x is C1<T>) (x as C1<T>).M1();
            else if (x is C2<T>) (x as C2<T>).M2();
        }

        public void Some()
        {
        }
    }