为指定的类名创建通用方法

时间:2013-11-15 13:53:02

标签: c# generics

我想为指定的类创建泛型方法。伪代码可能如下所示:

void doSend(Guid g)
{
   //code    
}
void doSend(Int32 i)
{
   //code     
}
void Send<T>(T param) where T:Guid or Int32
{
    //lots of code
    doSend(param) 
    //lots of code
}

我不想复制和粘贴整个实现只更改一行。

3 个答案:

答案 0 :(得分:2)

你没有理由这样做吗?

void Send(Guid param)
{
    ChunkA();
    doSend(param);
    ChunkB();
}

void Send(Int32 param)
{
    ChunkA();
    doSend(param);
    ChunkB();
}

void ChunkA()
{
  //lots of code
}

void ChunkB()
{
  //lots of code
}

另外,如果您只期望这两种类型......使用泛型会略微滥用它。您可能想退一步并重新考虑您的设计。

修改 由于您在评论中提到共同的代码是日志记录和错误处理,我认为对SendGuid进行Int32的重载更有意义。您可以使用Send方法看起来更像这样:

void Send(Guid param)
{
    try
    {
        LogSend(param);
        doSend(param);
    }
    catch (SendException e)
    {
        HandleSendException(e, param);
    }
}

答案 1 :(得分:0)

  

我不想复制和粘贴整个实现只更改一行。

然后不要。将所有通用代码移动到一个或多个方法中,从入口点调用这些方法,并只保留特定于Guidint的实现 在调用方法中:

void doSend(Guid g)
{
   //do stuff specific to `Guid`

   doSendCommon(g);   
}
void doSend(Int32 i)
{
   //do stuff specific to `int`

   doSendCommon(i);    
}

private void doSendCommon<T>(T value)
{
   // do stuff common to both
}

请注意,doSendCommon可以完全通用,但由于它是private ,您控制可以传入的类型。

答案 2 :(得分:0)

如何使用界面:

public interface IDoIt
{
    void DoIt();
}

public class Foo : IDoIt
{
    public void DoSomething()
    {

    }

    public void DoIt()
    {
        this.DoSomething();
    }
}

public class Bar : IDoIt
{
    public void DoSomethingElse()
    {

    }

    public void DoIt()
    {
        this.DoSomethingElse();
    }
}

public class GenericClass<T> where T: IDoIt, new ()
{
    public GenericClass()
    {
        T obj = new T();
        obj.DoIt();
    }
}