0

所以我有一个重载的方法。但是,这个概念相当简单。“接受任何 X 数据类型作为第一个参数,然后接受这两种数据类型中的任何一种作为其余两个参数”。有没有更简单的方法来做到这一点?这很快就会失控。

    //Declared MyMethod(byte[], SpecializedArgumentType, SpecializedArgumentType) and a string-> SpecializedArgumentType  version of it.
    public static MyReturnType MyMethod(bool data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(bool data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(short data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(short data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(ushort data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(ushort data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(int data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(int data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(uint data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(uint data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(long data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(long data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(ulong data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(ulong data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(float data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(float data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(double data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(double data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(char data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }
    public static MyReturnType MyMethod(char data, String firstArg, String secondArg)
    {
        return MyMethod(BitConverter.GetBytes(data), firstArg, secondArg);
    }

我尝试将任意对象作为数据类型,但是我不会在自动完成(Visual Studio ctrl-space)中获得好的显式数据类型。这真的必须如此冗长且难以维护吗?也许我对最初问题的处理方法需要修改?

4

2 回答 2

4

泛型呢?

public static MyReturnType MyMethod<T>(T data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg)
{
    ...
}

这样你就可以这样做:

ushort data = 42;
var result = MyMethod<ushort>(data,firstArg,secondArg);
于 2013-02-25T00:28:49.680 回答
0

您可以创建一个具有来自不同类型的隐式转换的数据类型,并将其用作第一个参数:

public class MyFirstParameter {

  public byte[] Bytes { get; private set; }

  private MyFirstParameter (byte[] bytes){
    Bytes = bytes;
  }

  public static implicit operator MyFirstParameter(int value) {
    return new MyFirstParameter(BitConverter.GetBytes(value));
  }

  public static implicit operator MyFirstParameter(long value) {
    return new MyFirstParameter(BitConverter.GetBytes(value));
  }

  // and a few more types

}

那将是一堆隐式运算符,但是您只需要方法的两个重载:

public static MyReturnType MyMethod(MyFirstParameter data, SpecializedArgumentType firstArg, SpecializedArgumentType secondArg) {
  return MyMethod(data.Bytes, firstArg, secondArg);
}

public static MyReturnType MyMethod(MyFirstParameter data, String firstArg, String secondArg) {
  return MyMethod(data.Bytes, firstArg, secondArg);
}

您可以使用具有隐式转换的任何类型调用方法,就像存在具有该类型的参数一样:

MyMethod(42, "", "");
于 2013-02-25T01:01:03.303 回答