我的任务是将一些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);
}
我有几个问题:
- 在Java中使用枚举是一个好的实践吗?
- 如果是或否,我应该在c#中采取什么方法?你能做类似的事情吗?即使我可以,我也不确定这种方法是否正确。
我不是要求别人为我转换这个…这是否是一个好方法,如果是的话,我是否应该尝试在c#中做同样的事情。如果不是,那么应该采取什么方法?
在Java中使用枚举是一个好的实践吗?
绝对。这正是在Java中引入枚举时所设想的用法。
我在c#中应该采取什么方法?
由于c# enum
不具有相同的功能,您需要以其他方式对其进行建模。一种方法是用Java enum
中的方法定义一个类或接口,并制作一堆模仿enum
条目的public readonly
实例:
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>
可以让您使用具有多个不同逻辑块的单个类,同时保留基于实例的调度。
采用这种方法的一个不幸的后果是,您将无法在这些enum
上执行switch
。
java枚举的使用是一个我没有资格回答的主观问题。我可以说你可以在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
}
}