有没有办法在代码中创建类变量的位置验证类变量的完整性?
例如,我创建并初始化一个类成员变量,如下所示:
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>);
}
}
正如我在代码中指出的那样,我想在"类"范围内验证数据的内容,但Debug.Assert
和Contract.Requires
只能在方法(或属性(范围内工作。
编辑: 这个问题最初使用一个列表作为示例,其内容(切线(与枚举相关,但人们关注的是该列表是如何从枚举派生的,而不是如何验证列表内容的问题。所以我完全重写了这个问题,以澄清这个问题是关于验证的,而不是关于构建数据结构的。
这就够了吗? https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors
静态构造函数也是对类型参数强制实施运行时检查的方便位置,该类型参数无法在编译时通过约束(类型参数约束(进行检查。
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数以初始化类。
但是单元测试可以更好。如果不是因为它们离代码很远,必须单独编写和维护。但至少它们没有运行时开销。
如果你的类型是你声明它在项目中的其他地方定义的,你可以从枚举创建列表。
using System.Linq;
enum Stuff
{
UglyStuff,
BrokenStuff,
HappyStuff
}
public class MyStuff
{
public static List<string> MyList => System.Enum.GetNames(typeof(Stuff)).ToList();
}