我在低级命名空间中有一个枚举。我想在“继承”低级枚举的中级命名空间中提供一个类或枚举。
namespace low
{
public enum base
{
x, y, z
}
}
namespace mid
{
public enum consume : low.base
{
}
}
我希望这是可能的,或者是某种类型的类,它可以代替枚举使用者,它将为枚举提供一个抽象层,但仍然允许该类的实例访问枚举。
有什么想法?
编辑:我没有在类中将其切换为const的原因之一是,我必须使用的服务需要低级枚举。我得到了WSDL和XSD,它们将结构定义为枚举。无法更改该服务。
发布于 2009-04-16 19:36:39
简短的回答是否定的。你可以玩一下,如果你想的话:
你总是可以这样做的:
private enum Base
{
A,
B,
C
}
private enum Consume
{
A = Base.A,
B = Base.B,
C = Base.C,
D,
E
}
但是,它并不能很好地工作,因为Base.A != Consume.A
不过,您始终可以这样做:
public static class Extensions
{
public static T As<T>(this Consume c) where T : struct
{
return (T)System.Enum.Parse(typeof(T), c.ToString(), false);
}
}
为了在基础和消费之间穿梭...
您还可以将枚举的值转换为整数,并将它们作为整数而不是枚举进行比较,但这也很糟糕。
扩展方法返回的类型应该转换为T类型。
发布于 2010-10-28 20:19:23
上面使用带有int常量的类的解决方案缺乏类型安全性。也就是说,你可以创造出实际上没有在类中定义的新值。此外,例如,不可能编写一个将这些类中的一个作为输入的方法。
您需要编写以下代码
public void DoSomethingMeaningFull(int consumeValue) ...
然而,过去的Java有一个基于类的解决方案,当时没有可用的枚举。这提供了一种几乎类似枚举的行为。唯一需要注意的是,这些常量不能在switch-语句中使用。
public class MyBaseEnum
{
public static readonly MyBaseEnum A = new MyBaseEnum( 1 );
public static readonly MyBaseEnum B = new MyBaseEnum( 2 );
public static readonly MyBaseEnum C = new MyBaseEnum( 3 );
public int InternalValue { get; protected set; }
protected MyBaseEnum( int internalValue )
{
this.InternalValue = internalValue;
}
}
public class MyEnum : MyBaseEnum
{
public static readonly MyEnum D = new MyEnum( 4 );
public static readonly MyEnum E = new MyEnum( 5 );
protected MyEnum( int internalValue ) : base( internalValue )
{
// Nothing
}
}
[TestMethod]
public void EnumTest()
{
this.DoSomethingMeaningful( MyEnum.A );
}
private void DoSomethingMeaningful( MyBaseEnum enumValue )
{
// ...
if( enumValue == MyEnum.A ) { /* ... */ }
else if (enumValue == MyEnum.B) { /* ... */ }
// ...
}
发布于 2009-04-16 19:44:42
忽略base是保留字的事实,您不能继承枚举。
你能做的最好的事情就是这样:
public enum Baseenum
{
x, y, z
}
public enum Consume
{
x = Baseenum.x,
y = Baseenum.y,
z = Baseenum.z
}
public void Test()
{
Baseenum a = Baseenum.x;
Consume newA = (Consume) a;
if ((Int32) a == (Int32) newA)
{
MessageBox.Show(newA.ToString());
}
}
由于它们都是相同的基类型(例如: int),您可以将一个类型的实例的值赋给另一个类型,即强制转换。不是很理想,但它是有效的。
https://stackoverflow.com/questions/757684
复制相似问题