在Java中,可以在枚举中包含方法.
在C#中是否存在这样的可能性,或者它只是一个字符串集合而且就是这样吗?
我试图覆盖ToString()但它不编译.有人有简单的代码示例吗?
在vs2008中,是否可以编写适用于任何枚举的扩展方法.
我知道你可以针对特定的枚举编写扩展方法,但我希望能够使用单个扩展方法进行每个枚举.这可能吗?
我对我的事情进行了枚举,如下:
public enum Things
{
   OneThing,
   AnotherThing
}
我想为这个枚举编写一个扩展方法(类似于Prize的答案)但是该方法适用于枚举的实例,ala
Things thing; var list = thing.ToSelectList();
我希望它能用于实际的枚举:
var list = Things.ToSelectList();
我可以这样做
var list = default(Things).ToSelectList();
但我不喜欢那样:)
我已经接近以下扩展方法:
public static SelectList ToSelectList(this Type type)
{
   if (type.IsEnum)
   {
      var values = from Enum e in Enum.GetValues(type)
                   select new { ID = e, Name = e.ToString() };
      return new SelectList(values, "Id", "Name");
   }
   else
   {
      return null;
   }
}
像这样使用:
var list = typeof(Things).ToSelectList(); …自从我开始使用.NET以来,这一直是我的一个宠儿,但我很好奇,以防我错过了什么.我的代码片段无法编译(请原谅示例的强制性质),因为(根据编译器)缺少return语句:
public enum Decision { Yes, No}
    public class Test
    {
        public string GetDecision(Decision decision)
        {
            switch (decision)
            {
                case Decision.Yes:
                    return "Yes, that's my decision";
                case Decision.No:
                    return "No, that's my decision";
            }
        }
    }
现在我知道我可以简单地放置一个默认语句来摆脱编译器警告,但在我看来,不仅是冗余代码,它的危险代码.如果枚举在另一个文件中并且另一个开发人员出现并将Maybe添加到我的枚举中,它将由我的默认子句处理,该子句对Maybe s 一无所知,并且我们很可能会引入逻辑错误.
然而,如果编译器允许我使用上面的代码,那么它可以识别我们有问题,因为我的case语句将不再覆盖枚举中的所有值.当然听起来对我来说更安全.
这对我来说根本就是错误的,我想知道它是否只是我缺少的东西,还是我们在switch语句中使用枚举时必须非常小心?
编辑: 我知道我可以在默认情况下引发异常或在交换机外添加一个返回,但这仍然是根本不能解决编译错误,这不应该是错误.
关于enum真的只是一个int,这是.NET肮脏的小秘密之一,真的非常令人尴尬.让我声明一个有限数量的可能性的枚举,并给我一个汇编:
Decision fred = (Decision)123;
然后如果有人尝试这样的事情,则抛出异常:
int foo = 123;
Decision fred = (Decision)foo;
编辑2:
有些人对enum在不同的程序集中会发生什么以及如何导致问题发表评论.我的观点是,这是我认为应该发生的行为.如果我更改方法签名,这将导致问题,我的前提是更改枚举应该是相同的.我的印象是很多人都不认为我理解.NET中的枚举.我只是认为这种行为是错误的,我希望有人可能知道一些非常模糊的功能会改变我对.NET枚举的看法.
是否可以使用ObjectDataProvider方法将ListBox绑定到枚举,并以某种方式设置样式以显示描述attriibute?如果是这样,怎么会这样做...?
我有一组扩展方法,我经常用于各种UI任务.我通常将它们定义为运行类型object,即使在它们内部我通常将它们转换为字符串类型.
public static string FormatSomething(this object o)
{
     if( o != null )
     {
          string s = o.ToString();
          /// do the work and return something.
     }
     // return something else or empty string.
}
我使用类型object而不是使用类型的主要原因string是<%#Eval("Phone").ToString().FormatSomething()%>在我可以做的时候将自己保存在UI中<%#Eval("Phone").FormatSomething()%>.
那么,从性能的角度来看,创建所有扩展方法是否正常object,或者我应该根据扩展方法的作用将它们转换为string(或相关)类型?