设计一个System.Enum类型参数的方法是否可以接受?

时间:2009-09-15 15:06:06

标签: c# enums

考虑以下方法,

public void Add(Enum key, object value);

由于Enum是一个“特殊类”,我没有意识到你可以用这种方式使用这个类型,但它编译。现在,.NET Framework设计指南对这个结构没什么好说的,所以我很好奇其他人对此的看法。

以下是此方法在内部执行的操作:

public void Add(Enum key, object value)
{
   this.dict.Add(key.ToString(), value)
}

您是否希望将参数转换为字符串或转换为int?

考虑以下用例

public enum Names
{
   John,
   Joe,
   Jill,
}

Add(Names.John, 10);
Add(Names.Joe, 11);

以这种方式使用枚举是使用字符串常量的可接受的替代方法(假设域是所有字符串的集合,也是有效的枚举标识符)?

最后一个问题:有没有人知道需要将抽象Enum基类作为参数传递的任何其他真实场景?

5 个答案:

答案 0 :(得分:4)

是的,使用Enum作为参数类型是完全有效的。

答案 1 :(得分:4)

将枚举值用作参数绝对有效。

  

以这种方式使用枚举是否可以替代使用字符串常量(...)?

是的,实际上这是枚举的主要用途之一。

使用一般的枚举值有点不太明显,因为您通常想知道可以期望的值。枚举值的常见用法是在switch语句中使用它,它有助于了解可以预期的值。枚举值的名称通常不重要,它就是它所代表的。

答案 2 :(得分:2)

最近使用Enum类的一个示例是扩展它以获取指定Enum值的DescriptionAttribute:link

答案 3 :(得分:1)

是的,它完全有效。但请确保枚举的可见性等于方法的可见性。

换句话说:如果您的方法是公开的,请将枚举公开。否则你将无法调用该方法。

String的Equals方法使用枚举作为比较选项的可选第二个参数:

String s = "Hello";
s.Equals("hello", StringComparison.OrdinalIgnoreCase);

修改 重读你的问题后,我理解你在问什么。我个人没有看到传递Enum元素只将其转换为字符串的好处。

我猜你试图容纳几种不同的衍生枚举类型?将枚举存储到字典中还是将参数限制为特定的派生实例会更好吗?

如果允许将任何派生的枚举传递给方法,则无法解决密钥唯一性问题。

答案 4 :(得分:0)

如果您设计工厂模式以生成具有不同用途的不同产品的类,当然还有一个共同的基础。但是所有这些产品都有能够描述其行为或状态的枚举。

您可以使用方法在基类中生成这些产品 喜欢

public class ProductsFactory
{
public static BaseProduct Create( string ProductName, Enum State)
{
....
  return new ProductX;
}
}
public class SailBoat: BaseProduct
{
public enum BoatState
{
Sailing,
Docked,
}
}

public class Airplain: BaseProduct
{
public enum AirplainState
{
Flying,
Landing,
TakingOff
}
}

void main
{
ProductFactory.Create("SailBoat", SailBoat.BoatState.Sailing);
ProductFactory.Create("Airplain", Airplain.AirplainState.Flying);
}