相关疑难解决方法(0)

如何从ASP.NET MVC中的枚举创建下拉列表?

我正在尝试使用Html.DropDownList扩展方法,但无法弄清楚如何将它与枚举一起使用.

假设我有一个这样的枚举:

public enum ItemTypes
{
    Movie = 1,
    Game = 2,
    Book = 3
}
Run Code Online (Sandbox Code Playgroud)

如何使用Html.DropDownList扩展方法创建包含这些值的下拉列表?

或者我最好的办法是简单地创建一个for循环并手动创建Html元素?

c# asp.net asp.net-mvc

653
推荐指数
21
解决办法
34万
查看次数

获取枚举的最大值

你如何获得枚举的最大值?

c# enums

139
推荐指数
6
解决办法
7万
查看次数

如何将泛型枚举转换为int?

我有一个小方法,看起来像这样:

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.有没有办法做到这一点?

c# enums

44
推荐指数
6
解决办法
2万
查看次数

如何使用Enum的通用Tryparse?

我正在尝试构建从用户字符串获取的泛型函数,并尝试将其解析为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转换特定的枚举?我怎样才能解决这个问题 ?谢谢.

c# generics enums

30
推荐指数
3
解决办法
2万
查看次数

如何将泛型类型参数限制为System.Enum

可能重复:
任何人都知道缺少枚举通用约束的好方法?
创建将T限制为枚举的通用方法

是否可以将泛型类型参数[我不知道这是否是正确的名称]限制为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.感谢大家的贡献.

.net c# vb.net enums

28
推荐指数
3
解决办法
2万
查看次数

在C#中使用枚举作为数组索引

我想在这个问题上做同样的事情,那就是:

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#中是否有内置模块可以做到这一点?

c# indexing enums

27
推荐指数
5
解决办法
4万
查看次数

按枚举排序列表<T>,其中枚举无序

我有一个消息列表.每条消息都有一个类型.

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# sorting

26
推荐指数
3
解决办法
2万
查看次数

C#7.3枚举约束:为什么我不能使用enum关键字?

为了将泛型类型参数约束为枚举类型,我之前将它们限制为这样,这是我在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约束.

我是否只是陷入了尚未完全实现的实验性特征陷阱,或者是否在规范中故意这样做(为什么?)?

c# generics enums c#-7.3

19
推荐指数
1
解决办法
2937
查看次数

"T:Enum"的<T>类不起作用

可能重复:
创建将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# enums templates class

15
推荐指数
2
解决办法
1万
查看次数

为什么Enum的HasFlag方法需要拳击?

我正在阅读"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,对吧?

.net c# enums boxing

13
推荐指数
2
解决办法
4201
查看次数

标签 统计

c# ×10

enums ×8

.net ×2

generics ×2

asp.net ×1

asp.net-mvc ×1

boxing ×1

c#-7.3 ×1

class ×1

indexing ×1

sorting ×1

templates ×1

vb.net ×1