C# 在嵌套枚举或嵌套类/结构之间进行选择

C# 在嵌套枚举或嵌套类/结构之间进行选择,c#,enums,C#,Enums,如果我需要一个类对象具有某个属性,让我们称它为“type” 我希望类型为“轮式”或“非轮式”。如果vehicle类的实例设置为具有轮式属性,我希望该属性还具有两个其他属性之一,例如“两轮”或“四轮”。 我尝试使用枚举来执行此操作,例如: private enum wheeledTypes { twoWheeled, fourWheeled } private enum Wheels { a = wheeledTypes.twoWheeled, b = wheel

如果我需要一个类对象具有某个属性,让我们称它为“type

我希望类型为“轮式”“非轮式”。如果vehicle类的实例设置为具有轮式属性,我希望该属性还具有两个其他属性之一,例如“两轮”“四轮”。

我尝试使用枚举来执行此操作,例如:

private enum wheeledTypes {
    twoWheeled,
    fourWheeled
}

private enum Wheels
{
    a = wheeledTypes.twoWheeled,
    b = wheeledTypes.fourWheeled,
    c = nonWheeled
}
但正如你所看到的,我得到了三种类型(a/b/c,我不想要)。我只想要a/b,或者轮式/非轮式,其中轮式可以是两种类型


编辑:如果使用了类,您会期望它们本身具有属性、构造函数、方法等。我不要这个。我只想将车辆设置为轮式(2/4)或非轮式。轮式和非轮式不应具有进一步的属性。这就是为什么我认为枚举是合适的。也许我错了

你应该像这样上课:

class Vehicle { }

class NonWheeledVehicle : Vehicle { }

class WheeledVehicle : Vehicle 
{ 
    internal enum WheelTypes { TwoWheeled, FourWheeled }
}
public enum WheelType
{
    TwoWeeled,
    FourWeeled
}

public class Vehicle
{

}

public class WheeledVehicle : Vehicle
{
    public WheelType WheelType { get; set; }
}

你会想要这样的东西:

class Vehicle { }

class NonWheeledVehicle : Vehicle { }

class WheeledVehicle : Vehicle 
{ 
    internal enum WheelTypes { TwoWheeled, FourWheeled }
}
public enum WheelType
{
    TwoWeeled,
    FourWeeled
}

public class Vehicle
{

}

public class WheeledVehicle : Vehicle
{
    public WheelType WheelType { get; set; }
}
然后,
车辆
是您的
非轮式
车辆类型,
有轮车辆
是您的
车辆
,该车辆具有特定的
车轮类型

使用类别

class Vehicle {
}

class Wheeled : Vehicle {
}

class NonWheeled : Vehicle {
}

class TwoWheeled : Wheeled {
}

class FourWheeled: Wheeled {
}

枚举不用作属性,而仅用作常量值(如整数、字符串等)的表示形式

您想要的是通过继承来实现的

// abstract if you do not want a vehicle to exist with having a concrete definition
public abstract class Vehicle {
}

public class NonWheeled : Vehicle{
}

public abstract class WheeledVehicle : Vehicle {
}

public class TwoWheeledVehicle : WheeledVehicle {
}

public class FourWheeledVehicle : WheeledVehicle {
}

public class ThousandWheeledVehicle : WheeledVehicle {
}

或者,根据您的需要,您可以将轮子的数量作为枚举保留为@rory.ap建议的

只是一个建议,但为什么不简单地将属性设置为null呢?这样,如果它为null,则它是非轮式的,并且您仍然可以与枚举进行直接比较

enum Wheels{
    twoWheeled,
    fourWheeled
}

class AnyClass
{
    public Wheels? Wheels{get;set;} //the question marks makes the property nullable
}

var a=  new AnyClass{Wheels = Wheels.twoWheeled};
if(a.Wheels == null){} //unwheeled
if(a.Wheels.HasValue){} //wheeled
if(a.Wheels==Wheels.twoWheeled){} //direct check on specific type also works

我个人也喜欢添加一个暴露属性的接口。通过这种方式,您可以在该接口上创建扩展方法,例如
静态bool HasWheels(此IWheels wheelsObject)

为什么不使用继承?您不应该拥有一辆基本
车辆
和一辆带有枚举
WheelType
的儿童
WheeledVehicle
?这里的无轮车辆在哪里?基类不是“vehicle”吗?除了你的两个派生类之外,还有3个派生类——“NonWheeledVehicle”。@Camilotervito--我想我读这个问题的速度有点太快了。但问题是,当你定义类时,你希望它们本身有属性、构造函数、方法等等。我不要这个。我只想将车辆设置为轮式(2/4)或非轮式。轮子和非轮子不应该有更多的属性。@StephenJohnson——不,那根本不是真的。正如我所展示的,类可以像空类型一样简单。它们只是工具,而且灵活且可扩展。一旦你接受了这个想法并在实践中反复使用它,你就会对它感到更舒服。这是如何让你只使用
轮式
非轮式
类型的呢?使用type of so if vehicle.GetType()==typeof(轮式)比它的轮子如果有轮子,车辆也会在下面。GetType()==typeof(双轮)是两轮的他想要两种,不是三种我只是给他一个建议,不是最后的代码。这是一种方法。这如何只提供
轮式
非轮式
类型?正确。增加了更多的抽象OP希望有两种类型:轮式和非轮式,其中轮式可能有2个或4个轮子。你给了他4种不同的类型。OP对枚举的理解完全错误。你也是对的,因此我也指出了@rory.ap的答案