我的任务是将一些Java代码转换为C#并遇到以下枚举(我不得不概括它,因为代码是专有的,对不起)。该代码的一般目的是从“非基本单位”转换为“基本单位”(如从公里转换为毫米,或者其他任何东西。他们有大量的转换)。我改变的唯一的东西是变量名称。代码中的模式与此类似......
public enum ThisIsAnEnum implements someInterface
{
typeKilom( MetricType.kilometer ),
typeMillm( MetricType.millimeter );
public double convertSomething(double dbl1, double dbl2)
{
// do stuff
return a double
}
}
然后在代码中调用它,如下所示:
public static void main( String[] args )
{
ThisIsAnEnum.typeKilom.convertSomething(aDouble, bDouble);
}
我有几个问题:
我不是要求有人为我转换这个...只是这是一个好的方法和(如果是的话)我应该尝试在C#中做同样的事情。如果不是,那么应该采取什么方法?
答案 0 :(得分:2)
枚举的使用在Java中是一种很好的做法吗?
绝对。这正是在Java中引入的枚举时所设想的那种用法。
我应该采用什么方法进行C#?
由于C#enum
没有相同的功能,您需要以其他方式对其进行建模。一种方法是使用Java enum
中的方法定义类或接口,并创建一组模仿public readonly
条目的enum
个实例:
public ISomeInterface {
Func<double,double,double> ConvertSomething {get;}
}
public class ThisIsAnEnum : ISomeInterface {
public Func<double,double,double> ConvertSomething {get;private set;}
public MetricType MetricType {get;private set;}
// Private constructor prevents outside instantiations
private ThisIsAnEnum(MetricType mt) {
MetricType = mt;
}
public static readonly ThisIsAnEnum TypeKilom = new ThisIsAnEnum(MetricType.Kilometer) {
ConvertSomething = (dbl1, dbl2) => {
...
return res;
}
}
public static readonly ThisIsAnEnum TypeMillim = new ThisIsAnEnum(MetricType.Millimeter) {
ConvertSomething = (dbl1, dbl2) => {
...
return res;
}
}
}
使用Func<double,double,double>
可以使用具有多个不同逻辑的单个类,同时根据实例保留调度。
采用这种方法的一个不幸后果是,您无法在这些switch
上enum
。
答案 1 :(得分:1)
使用java enums是一个主观问题,我不太有资格回答。我可以说你可以使用扩展方法在C#中解决你的问题。我不确定界面有什么相关性,但鉴于你所展示的内容,你可以像这样重现它。
void Main() {
ThisIsAnEnum.typeKilom.ConvertSomething(1, 2);
}
public enum ThisIsAnEnum {
typeKilom,
typeMillm,
}
public static class ThisIsAnEnumExtensions {
// extension method
public static double ConvertSomething(this ThisIsAnEnum @this, double dbl1, double dbl2) {
return dbl1 + dbl2; // do stuff
}
}