由于这个问题,我设法弄清楚如何限制我的通用方法仅接受枚举。
现在,我尝试创建一个通用方法,以便可以将下拉列表绑定到我选择的任何枚举,在下拉列表中显示描述,其值等于枚举值的数值。
public static object EnumToDataSource<T>() where T : struct, IConvertible {
if (!typeof(T).IsEnum) // just to be safe
throw new Exception(string.Format("Type {0} is not an enumeration.", typeof(T)));
var q = Enum.GetValues(typeof(T)).Cast<T>()
.Select(x => new { ID = DataUtil.ToByte(x), Description = x.ToString() }) // ToByte() is my own method for safely converting a value without throwing exceptions
.OrderBy(x => x.Description);
return q;
}
Run Code Online (Sandbox Code Playgroud)
看起来不错,但 ToByte() 始终返回 0,即使我的枚举已显式设置值,如下所示:
public enum TStatus : byte {
Active = 1,
Inactive …Run Code Online (Sandbox Code Playgroud) 可能重复:
C#:如何枚举枚举?
大家好我想知道,假设我定义了一个类似的枚举
enum color
{
red=4;
blue=5;
gray=6;
green=8;
}
Run Code Online (Sandbox Code Playgroud)
所以我们可以在for循环的帮助下打印常量值,我的意思是我们可以通过循环来控制它; 另一个问题是我们可以将它与下拉列表集成,如数组.我的意思是当我们在侧面数组中声明一个元素时假设我写了相同的颜色元素,并且我们可以在asp.net中添加列表或下拉列表(带控件的简单单词绑定),我们可以用枚举执行同样的事情.
可能重复:
如何枚举枚举?
所以我有一些像这样的代码:
enum Decision
{
DecisionA,
DecisionB,
...
}
public void DoStuff(Decision d)
{
switch(d)
{
case Decision.DecisionA:
....
...
}
}
Run Code Online (Sandbox Code Playgroud)
基本上DoStuff,无论做出什么决定,都会做同样的事情,但决定是用来做出更优化的事情(更快或更好).
现在,我想为DoStuff实现单元测试.通过使用类似的数组来测试所有Decisions是否正常工作相当容易.new Decision[]{DecisionA, DecisionB, ...};但是,如果我添加一个决定,那么我必须返回并手动将其添加到单元测试中.
是否可以只访问由a指定的所有可能选项enum?例如,像这样:
foreach(var d in Decision.Options)
{
//d will be DecisionA, and then DecisionB, etc etc
}
Run Code Online (Sandbox Code Playgroud) 当我声明枚举时,我经常添加一个NOT_SET = 0值来知道实例何时尚未初始化.当我枚举这种枚举的值时(如此处和此处所述),丢弃NOT_SET值的最佳方法是什么?我能想到的最好的是
Enum.GetValues(typeof(T)).Cast<int>().Where(item => (0 != (int)item)).Cast<T>();
Run Code Online (Sandbox Code Playgroud)
我不喜欢它,因为与所有那些Cast <>的迭代太多了.我更喜欢基于的东西
(T[]) Enum.GetValues(typeof(T))
Run Code Online (Sandbox Code Playgroud)
没有所有的Cast <>.
可能重复:
如何枚举枚举?
假设有一个枚举
public enum Numbers {one, two, three };
Run Code Online (Sandbox Code Playgroud)
为了得到输出"one","two","three",我需要写下以下代码中的三个点而不是:
foreach (Numbers n in ...) {
Console.WriteLine (n.ToString ());
}
Run Code Online (Sandbox Code Playgroud)
当然,我想以一种方式这样做,即修改枚举定义不需要修改foreach()中的代码.
我正在创建一副卡片,并在Enums中使用我的Suits和Values,但是我的语法在尝试填充我的List套牌时没有.另外,Ace可以具有1或11的值,是否有某种方法可以将其合并到我的Enum中,或者我是否需要在执行诸如为二十一点求手之类的事情时编写代码?
public class Deck
{
private List<Card> cards;
private Random random = new Random();
public Deck()
{
cards = new List<Card>();
for (int s = 0; s < 4; s++)
//for (int v = 0; v < 14; v++)
foreach(Enum v in Values)
cards.Add(new Card((Suits)s, (Values)v));
}
Run Code Online (Sandbox Code Playgroud)
这是我的诉讼和价值的枚举:
public enum Suits
{
Spades,
Clubs,
Diamonds,
Hearts
}
public enum Values
{
Ace = 1,
Two = 2,
Three = 3,
Four = 4,
Five = 5,
Six = 6,
Seven …Run Code Online (Sandbox Code Playgroud) 在CMD语言中,您可以像下一样定义所有:del C:\randomfiles\*
这意味着您一次选择所有文件.我有代码,var names = new List<System.Drawing.Color> { Red, DarkRed, 1000 colors later... };但我不想用所有颜色,因为这可能需要数年...我怎么能像CMD语言一样定义所有颜色?编辑:这与以下不一样:如何枚举枚举?因为我想要所有颜色,而不是花费多年时间写出所有颜色....