我在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;
}
}
现在我想为Write
和Read
调用一行中的多个变量,其中一个变量属于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
/ Read
,Writer
/ Reader
或MyEnum
,以便w.Write(e)
自动解析为Writer.Write(int)
,更重要的是r.Read(out e)
到Reader.Read(int)
?
答案 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#不支持enum
到int
的隐式类型转换或反之亦然,即使使用技巧。
因此,我想要的&#34; one-method处理所有枚举类型&#34;解决方案是不可能实现的。
如果你不能(项目层次结构)或者不想为每个枚举类型添加重载到Writer
/ Reader
类本身,你可以为枚举类型创建扩展方法。