我正在尝试使用Html.DropDownList扩展方法,但无法弄清楚如何将它与枚举一起使用.
假设我有一个这样的枚举:
public enum ItemTypes
{
Movie = 1,
Game = 2,
Book = 3
}
Run Code Online (Sandbox Code Playgroud)
如何使用Html.DropDownList扩展方法创建包含这些值的下拉列表?
或者我最好的办法是简单地创建一个for循环并手动创建Html元素?
我有一个小方法,看起来像这样:
public void SetOptions<T>() where T : Enum
{
int i = 0;
foreach (T obj in Enum.GetValues(typeof(T)))
{
if (i == 0)
DefaultOption = new ListItem(obj.Description(), obj.ToString());
i++;
DropDownList.Items.Add(new ListItem(obj.Description(), obj.ToString()));
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我从枚举中填充下拉列表.Description()实际上是枚举的扩展方法,所以T绝对是一个enum.
但是,我想像obj你这样对任何枚举进行(int)obj转换,但是我得到一个错误,说我无法将T转换为int.有没有办法做到这一点?
我正在尝试构建从用户字符串获取的泛型函数,并尝试将其解析为Enum valuse,如下所示:
private Enum getEnumStringEnumType(Type i_EnumType)
{
string userInputString = string.Empty;
Enum resultInputType;
bool enumParseResult = false;
while (!enumParseResult)
{
userInputString = System.Console.ReadLine();
enumParseResult = Enum.TryParse(userInputString, true, out resultInputType);
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到:
The type 'System.Enum' must be a non-nullable value type in order to use it as parameter 'TEnum' in the generic type or method 'System.Enum.TryParse<TEnum>(string, bool, out TEnum) .
Run Code Online (Sandbox Code Playgroud)
错误意味着我需要为resultInputType转换特定的枚举?我怎样才能解决这个问题 ?谢谢.
是否可以将泛型类型参数[我不知道这是否是正确的名称]限制为Enum?
例如,我该怎么做这样的事情?
//VB.NET
Function GetValues(Of T As System.Enum)(ByVal value As T) As IEnumerable(Of T)
Return [Enum].GetValues(value.GetType)
End Function
//C#
public IEnumerable<T> GetValues<T>(T value) where T : System.Enum
{
return Enum.GetValues(value.GetType());
}
Run Code Online (Sandbox Code Playgroud)
更新
为了这个目的,我最终使用了Jon Skeet的Unconstrained Melody.感谢大家的贡献.
我想在这个问题上做同样的事情,那就是:
enum DaysOfTheWeek {Sunday=0, Monday, Tuesday...};
string[] message_array = new string[number_of_items_at_enum];
...
Console.Write(custom_array[(int)DaysOfTheWeek.Sunday]);
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿有一些不可或缺的东西,而不是写这个容易出错的代码.C#中是否有内置模块可以做到这一点?
我有一个消息列表.每条消息都有一个类型.
public enum MessageType
{
Foo = 0,
Bar = 1,
Boo = 2,
Doo = 3
}
Run Code Online (Sandbox Code Playgroud)
枚举名称是任意的,无法更改.
我需要返回列表排序为:Boo,Bar,Foo,Doo
我目前的解决方案是创建一个tempList,按我想要的顺序添加值,返回新列表.
List<Message> tempList = new List<Message>();
tempList.AddRange(messageList.Where(m => m.MessageType == MessageType.Boo));
tempList.AddRange(messageList.Where(m => m.MessageType == MessageType.Bar));
tempList.AddRange(messageList.Where(m => m.MessageType == MessageType.Foo));
tempList.AddRange(messageList.Where(m => m.MessageType == MessageType.Doo));
messageList = tempList;
Run Code Online (Sandbox Code Playgroud)
我怎么能用IComparer做到这一点?
为了将泛型类型参数约束为枚举类型,我之前将它们限制为这样,这是我在C#7.3之前为枚举约束类型T的最佳方法:
void DoSomething<T>() where T : struct, IComparable, IConvertible, IFormattable
Run Code Online (Sandbox Code Playgroud)
现在,C#7.3添加了一个新功能来约束泛型类型System.Enum.我尝试使用今天发布的VS2017 15.7更新的枚举约束,并且当我这样写时它会成功编译(假设我有一个using System;指令):
void DoSomething<T>() where T : Enum
Run Code Online (Sandbox Code Playgroud)
但是,使用enum关键字不起作用并导致编译器抛出以下错误(后面有更多错误,期待一个方法体,但我猜这里并不值得一提):
void DoSomething<T>() where T : enum
^ error CS1031: Type expected
error CS1002: ; expected
^ error CS1001: Identifier expected
error CS1514: { expected
error CS1513: } expected
Run Code Online (Sandbox Code Playgroud)
由于有一个struct约束适用于结构,我不明白为什么enum这里不适用于枚举.这是真正的enum不映射到一个实际的类型一样int会为这样做Int32,但我认为它应该表现一样的struct约束.
我是否只是陷入了尚未完全实现的实验性特征陷阱,或者是否在规范中故意这样做(为什么?)?
可能重复:
创建将T限制为枚举的通用方法
我们有什么理由不能在C#中做到这一点吗?而且,如果可能的话,我该怎么做类似的事情!
我想要的是 :
public class<T> ATag where T : enum {
[Some code ..]
}
public class<T> classBase where T : enum {
public IDictionary<T, string> tags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以,当它到了调用它的时候,我只能得到一个我的枚举值.
public class AClassUsingTag : classBase<PossibleTags> {
public void AMethod(){
this.tags.Add(PossibleTags.Tag1, "Hello World!");
this.tags.Add(PossibleTags.Tag2, "Hello Android!");
}
}
public enum PossibleTags {
Tag1, Tag2, Tag3
}
Run Code Online (Sandbox Code Playgroud)
错误信息 : "Constraint cannot be special class 'System.Enum'"
谢谢!
我正在阅读"C#via CLR"和第380页,有一条说明如下:
注意Enum类定义HasFlag方法,定义如下
public Boolean HasFlag(Enum flag);使用此方法,您可以重写对Console.WriteLine的调用,如下所示:
Console.WriteLine("Is {0} hidden? {1}", file, attributes.HasFlag(FileAttributes.Hidden));但是,我建议您出于这个原因避免使用HasFlag方法:
由于它采用了Enum类型的参数,因此传递给它的任何值都必须装箱,需要进行内存分配."
我无法理解这个粗犷的陈述 - 为什么"
您传递给它的任何值都必须装箱
该flag参数的类型是Enum,这是一个值类型,为什么会有拳击?"传递给它的任何值必须装箱"应该意味着当你将值类型传递给参数时会发生装箱Enum flag,对吧?