如何在公共方法上验证枚举参数?

时间:2014-05-22 13:33:38

标签: c# validation enums code-analysis

我有一个Enum的扩展方法:

public static List<Enum> Values(this Enum theEnum)
{
    return Enum.GetValues(theEnum.GetType()).Cast<Enum>().ToList();
}

我违反了代码分析:

  

CA1062验证公共方法的论据
  在外部可见   方法&#39; EnumExtensions.Values(此枚举)&#39;,验证参数   &#39; theEnum&#39;在使用之前。

为什么会这样?如何验证参数?我无法检查null,因为枚举是一个不可为空的值类型。是否有其他检查应该在这里发生?

2 个答案:

答案 0 :(得分:5)

  

我无法检查null,因为枚举是一种不可为空的值类型。

任何特定的枚举都是值类型,但Enum本身并不是。 (就像ValueType不是值类型一样......从ValueType 派生的每个类型除了Enum 都是值类型。)

换句话说,我可以写:

Enum foo = null;
var bang = foo.GetValues();

那将编译然后在执行时使用NullReferenceException失败。

鉴于您忽略了除了获取其类型之外的值,我实际建议删除它并 接受Type 制作它你想要的枚举类型的泛型。但是如果你想保留当前的签名,你只需要:

if (theEnum == null)
{
    throw new ArgumentNullException();
}

您可能还想查看我的Unconstrained Melody项目,它为枚举提供了一堆辅助方法,通过IL操作通常限制为枚举类型。

答案 1 :(得分:0)

enum关键字用于声明枚举,这是一个由称为枚举器列表的一组命名常量组成的不同类型。

它仅用于声明另一个枚举。在任何情况下,输入都应该是您的声明。

public enum theEnum { 
  enum1,
  enum2
}

public void ShowEnum(theEnum e) 
{
   System.Console.WriteLine(e.GetType());        
}