C# 如何验证方法外部的条件

C# 如何验证方法外部的条件,c#,code-contracts,C#,Code Contracts,是否有方法在创建类变量的代码中验证该类变量的完整性? 例如,我创建并初始化一个类成员变量,如下所示: public class MyClass { public static Dictionary<MyEnum, int> SomeDictionary = new Dictionary<MyEnum, int> { { MyEnum.First, 9 }, { MyEnum.Second, 7 },

是否有方法在创建类变量的代码中验证该类变量的完整性?

例如,我创建并初始化一个类成员变量,如下所示:

public class MyClass
{
  public static Dictionary<MyEnum, int> SomeDictionary = new Dictionary<MyEnum, int> {
            { MyEnum.First, 9 },
            { MyEnum.Second, 7 },
            { MyEnum.Third, 17 }
  };

  // This obviously doesn't compile
  Debug.Assert(<SomeDictionary contains good stuff>);

  // Some method in my class
  public void SomeMethod()
  {
    // I could use something like this in this method to verify
    // the integrity of SomeDictionary, but I'd rather do this
    // at the point (above) where SomeDictionary is defined.
    Contract.Requires(<SomeDictionary contains expected stuff>);
  }
}
公共类MyClass
{
公共静态字典SomeDictionary=新字典{
{MyEnum.首先,9},
{MyEnum.Second,7},
{MyEnum.第三,17}
};
//这显然不能编译
Assert();
//我的课堂上有些方法
公共方法()
{
//我可以用这种方法来验证
//一些字典的完整性,但我宁愿这样做
//在(上面)定义SomeDictionary的地方。
合同。要求();
}
}
正如我在代码中指出的,我希望在“class”范围内验证数据的内容,但
Debug.Assert
Contract.Requires
仅在方法(或属性)范围内工作

编辑:
这个问题最初以一个列表为例,该列表的内容(与枚举相切)相关,但人们关注的是该列表是如何从枚举中派生出来的,而不是如何验证列表内容的问题。因此,我完全重写了这个问题,以澄清这个问题是关于验证的,而不是关于构建数据结构的。

如果您拥有该类型,并且声明它是在项目中的其他地方定义的,那么您可以从enum创建该列表

using System.Linq;

enum Stuff
{
  UglyStuff,
  BrokenStuff,
  HappyStuff
}

public class MyStuff
{
  public static List<string> MyList => System.Enum.GetNames(typeof(Stuff)).ToList();
}
使用System.Linq;
枚举内容
{
乌格里斯凝灰岩,
BrokenStuff,
快乐之旅
}
公共类MyStuff
{
公共静态列表MyList=>System.Enum.GetNames(typeof(Stuff)).ToList();
}
这就足够了吗

静态构造函数也是对类型参数强制执行运行时检查的一个方便的地方,这些类型参数在编译时不能通过约束(类型参数约束)进行检查

在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类


但是单元测试可以更好。如果不是因为它们远离代码,必须单独编写和维护。但至少它们没有运行时开销。

为什么不基于枚举值生成列表,而不是验证硬编码值?这只是一个示例。在实际应用中,相关性并不是那么简单。(实际上,我的实际应用程序是一个字典,而不是一个列表,我需要验证一个枚举的每个成员都有一个字典条目。)我的建议是编写测试,确保字典包含所有枚举值的键,我希望您编写自动测试:)。通过测试,您可以使生产代码不受语言缺失功能的影响。@Fabio编写单元测试来验证列表(或字典或其他内容)的内容并不是对OP的真正回答(OP询问如何在代码中声明数据的点进行测试),但我喜欢它!没有更好的答案,如果你用你的“建议”作为答案,我会接受的it@Gauravsa我认为一个更新,或者更好地称之为完全重写,将使我的第一个答案下的评论变得无关紧要。我错了吗?好吧,评论可以被相应的用户删除。很多时候,人们会删除不再相关的评论