所以我正在使用Compact Framework 2.0编写一个C#应用程序,我想知道我是否可以做比我脑子里计划更简单的事情。
如果有完整或紧凑的其他框架的答案,但不是这个,我仍然希望听到它们,这就是为什么标签在这个时间点不包括紧凑框架2.0。
实际上,用户将能够选择他们想要设置的项目是A类型还是B类型,然后选择他们想要在该分类下使用/设置的具体设置。我想使用枚举来保持代码清晰,因为这适用于我的工作场所,如果我不在身边,人们应该能够阅读它。
我的想法:
以下是应用程序的全局,而不是特定的类:
enum EnumTypes
{
A, B,
Num_Types,
}
enum EnumA
{
Setting1 = 0, Setting2, Setting3, //and so on...
Num_A_Settings, //WILL be different from B
}
enum EnumB
{
Setting1 = 0, Setting2, Setting3, //and so on...
Num_B_Settings, //WILL be different from A
}
以下是函数/属性的示例,该类将使用这些值来完成其工作,显然只暴露其他类所需的内容。
public class SettingClass
{
public EnumTypes TypeUsed {/*basic get/set for property*/}
public int SelectedSettingIndex {/*basic get/set for property*/}
private ClassX[][] _settingsData = new ClassX[(int)Num_Types][];
public SettingClass()
{
for(int i = 0; i < (int)EnumTypes.Num_Types;i++)
{
if((EnumTypes)i == EnumTypes.A)
{
_settingsData[i] = new ClassX[(int)EnumA.Num_A_Settings];
//for loop for initializing each ClassX instance for A
}
else if((EnumTypes)i == EnumTypes.B)
{
_settingsData[i] = new ClassX[(int)EnumB.Num_B_Settings];
//for loop for initializing each ClassX instance for B
}
}
//just an example
public IncrementSetting()
{
if(TypeUsed == EnumTypes.A)
{ /*range checking using Num_A_Settings, increments SelectedSettingIndex*/ }
else if(TypeUsed == EnumTypes.B)
{ /*range checking using Num_B_Settings, increments SelectedSettingIndex*/ }
}
}
请不要过于陷入每个类/变量的详细信息以及它是如何初始化的等等,因为这是一个快速写出的想法,试图表达我所询问的内容。我没有从我的代码中复制/粘贴它。
有没有办法,而不是只为“settingIndex”暴露一个int,我可以公开枚举并显示EnumA或EnumB值到这个类的任何使用?
现在,任何必须获得所选设置索引的内容都必须基本上说“什么类型,A或B?它是A,好吧,所以int实际上意味着来自A的值,而不是来自B,caste int到EnumA ......“或者类似的,可以在这个类的外面快速复杂化,以便封装所有的工作。
我在考虑是否有某种遗传我可以做或类似,但我怀疑是否存在。
答案 0 :(得分:0)
您可以使用Dictionary<Enum,ClassX>
代替数组。然后,只要您在使用Enum
的任何地方使用int
而不是enum
,就可以获得完整的类型信息,并且可以区分各个枚举值。
AC#enum
有一个有趣的属性,出于性能原因,它可以像你所需的int
一样,但是当你需要时它很高兴成为一个完全成熟的object
将类型信息附加到其值。
我刚用来测试所有这些的LINQPad代码:
void Main()
{
Dictionary<Enum,object> dict = new Dictionary<Enum,object>();
dict.Add(asdf.lkj,null);
dict.Add(qwer.oiu,null);
Console.WriteLine(dict.ContainsKey(qwer.oiu));
Console.WriteLine(dict.ContainsKey(asdf.lkj));
Console.WriteLine(dict.ContainsKey(qwer.zxcv));
}
enum asdf {
lkj
}
enum qwer {
oiu,
zxcv
}
及其输出
True
True
False
答案 1 :(得分:0)
以下示例通过反射包装和解包枚举值,它是否接近您要查找的内容?
namespace App
{
class Program
{
static void Main(string[] args)
{
var val = new EnumWrapper(B.f);
Enum en = val.EnumVal;
Console.WriteLine("{0}.{1}",en.GetType().Name,en);
}
}
enum EnumType { A, B }
enum A { a, b, c = 34, d = 12 }
enum B { a, b, e = 54, f = 56 }
class EnumWrapper
{
public EnumWrapper(Enum i)
{
type = (EnumType) Enum.Parse( typeof(EnumType), i.GetType().Name );
index = Convert.ToInt32(i);
}
public EnumType type;
public int index;
public Enum EnumVal {
get {
Enum c = (Enum)Enum.ToObject(
Type.GetType(
"App." + type
), index
);
return c;
}
}
}
}