如何为枚举类型使用C#use int方法重载?

时间:2015-11-19 13:32:46

标签: c# enums overloading

我在C#中有一个类,它有多个不同参数类型的重载:

class Writer
{
  public Writer Write(bool value)
  {
    // Do something with value
    return this;
  }
  public Writer Write(double value)
  {
    // Do something with value
    return this;
  }
  public Writer Write(int value)
  {
    // Do something with value
    return this;
  }
  public Writer Write<T>(T value) where T : class, IInterface, new()
  {
    // Do something with value
    return this;
  }
}

class Reader
{
  public Reader Read(out bool value)
  {
    // Retrieve value
    return this;
  }
  public Reader Read(out double value)
  {
    // Retrieve value
    return this;
  }
  public Reader Read(out int value)
  {
    // Retrieve value
    return this;
  }
  public Reader Read<T>(out T value) where T : class, IInterface, new()
  {
    // value = new T() or null
    return this;
  }
}

现在我想为WriteRead调用一行中的多个变量,其中一个变量属于enum类型。但是,该枚举类型会导致方法解决方面的困难。 (顺便说一句:我习惯于VB.NET,其中Enum类型与Integer参数兼容。)

enum MyEnum : int
{
  Foo = 0, Bar = 1
}

class CallingClass
{
  public void Call()
  {
    bool b;
    double d;
    int i;
    IInterface o;
    MyEnum e = MyEnum.Foo;

    var w = new Writer();

    // Unintuitive for Write
    w
      .Write(b)
      .Write(d)
      .Write(i)
      .Write(o)
      .Write((int) e);

    // w.Write(e); // resolves to Writer.Write<T>(T)
    // => Compile error: "MyEnum has to be reference type to match T"

    // Even worse for Read, you need a temp variable
    // and can't use fluent code anymore:

    var r = new Reader();
    r
      .Read(out b)
      .Read(out d)
      .Read(out i)
      .Read(out o);
    int tmp;
    r.Read(out tmp);
    e = (MyEnum) tmp;
  }
}

我有什么方法可以修改Write / ReadWriter / ReaderMyEnum,以便w.Write(e)自动解析为Writer.Write(int),更重要的是r.Read(out e)Reader.Read(int)

3 个答案:

答案 0 :(得分:1)

答案有点晚,但由于我遇到了同样的问题,所以像这样的过载应该可以工作

public void Foo(int a)
{
    // do something
}

public void Foo(Enum @enum)
{
    Foo(Convert.ToInt32(@enum));
}

答案 1 :(得分:0)

使用where约束:

public void Get<T>(out T value) where T : class, IInterface, new()

你明确地说T必须是引用类型(不是值类型,因为枚举是)。尝试删除类约束。

[编辑] 你也可以尝试这个,避免出现参数:

  public T Get<T>() where T : new()
  {
    return default(T);
  } 

并将其命名为

c.Get<MyEnum>();

但同样,如果你添加一个IInterface约束,没有Enum可以满足它。

答案 2 :(得分:0)

从评论到我的问题和Gian Paolo的回答,很明显 - 与VB.NET相反 - C#不支持enumint的隐式类型转换或反之亦然,即使使用技巧。

因此,我想要的&#34; one-method处理所有枚举类型&#34;解决方案是不可能实现的。

如果你不能(项目层次结构)或者不想为每个枚举类型添加重载到Writer / Reader类本身,你可以为枚举类型创建扩展方法。