泛型类c#方法的特例

时间:2014-01-26 11:24:16

标签: c# generics

是否可以使泛型类的方法对特定类型的行为完全不同?

class MyClass<T> {
    public void myMethod(T t) { // Do something }

    // something for myMethod(int t) { // DO something special }
}

通过这种方式,我可以拨打(new MyClass<String>()).myMethod(myString)来执行某项操作,并致电(new MyClass<int>()).myMethod(myInt),这会做一些特别的事情。

3 个答案:

答案 0 :(得分:4)

我认为你最好只使用重载,而不是泛型。

例如:

public void myMethod(int t)
{
}

public void myMethod(string t)
{
}

可以在泛型中进行类型检查,但这不是最佳做法。

根据您的编辑和讨论,我相信这就是您想要的:

class Program
{
    static void Main(string[] args)
    {
        IntClass c1 = new IntClass();
        c1.MyMethod(12);

        BaseClass<string> c2 = new BaseClass<string>();
        c2.MyMethod("hello world");
    }
}

class BaseClass<T>
{
    public virtual void MyMethod(T t)
    {
        Console.WriteLine(string.Format("Param: {0}", t));
    }
}

class IntClass : BaseClass<int>
{
    public override void MyMethod(int myVar)
    {
        Console.WriteLine(string.Format("Param: int"));
    }
}

答案 1 :(得分:1)

继续进行并且都有重载,

public void myMethod(T t) { ... }

public void myMethod(int t) { ... }

这两种方法都是非泛型的,但是一种方法使用包含类的T

如果你构建

MyClass<int>

两种方法的签名将联合。你害怕什么?

电话(new MyClass<int>()).myMethod(42);进入第二次重载。


我可能误解了你的问题。你只想要一种方法吗?在int的情况下,您想要做些什么?你可以制作如下代码:

public void myMethod(T t)
{
  // do something

  if (typeof(T) == typeof(int))
  {
    // special case
    // if you need t as an int, you can use the ugly (int)(object)t
  }

}

您还可以考虑为int案例编写特定的类。该课程可能来自一般课程(您的方法可能是virtual)。

答案 2 :(得分:0)

只需使用该方法的非泛型重载:

public void myMethod(int t) { // Special case for integer argument }
public void myMethod<T>(T t) { // Generic method for everything else }