我想知道是否可以获取枚举值的属性而不是枚举本身的属性?例如,假设我有以下枚举:
using System.ComponentModel; // for DescriptionAttribute
enum FunkyAttributesEnum
{
[Description("Name With Spaces1")]
NameWithoutSpaces1,
[Description("Name With Spaces2")]
NameWithoutSpaces2
}
Run Code Online (Sandbox Code Playgroud)
我想要的是枚举类型,产生2元组的枚举字符串值及其描述.
价值很容易:
Array values = System.Enum.GetValues(typeof(FunkyAttributesEnum));
foreach (int value in values)
Tuple.Value = Enum.GetName(typeof(FunkyAttributesEnum), value);
Run Code Online (Sandbox Code Playgroud)
但是如何获取描述属性的值,以填充Tuple.Desc?如果属性属于枚举本身,我可以想到如何做到这一点,但我不知道如何从枚举的值中获取它.
在.NET 3.5中将Enum转换为String的首选方法是什么?
为什么我更喜欢其中一个呢?一个表现更好吗?
我在ViewModelBase
类中有以下辅助方法,它由其他视图模型继承:
public string GetEnumName<T>(Enum value)
{
Type enumType = typeof(T);
var enumValue = Enum.GetName(enumType, value);
MemberInfo member = enumType.GetMember(enumValue)[0];
var attrs = member.GetCustomAttributes(typeof(DisplayAttribute), false);
var outString = ((DisplayAttribute)attrs[0]).Name;
if (((DisplayAttribute)attrs[0]).ResourceType != null)
{
outString = ((DisplayAttribute)attrs[0]).GetName();
}
return outString;
}
Run Code Online (Sandbox Code Playgroud)
然后我从这样的视图中调用它:
<p>
@{var rel = Model.GetEnumDisplayName<Enums.wheteverEnum>(Model.wheteverEnum); }
@rel
</p>
Run Code Online (Sandbox Code Playgroud)
问题是 - 我可以使用这种方法,所以我不必告诉它的类型enum
吗?基本上我想为所有人做这个enum
:
@ Model.GetEnumDisplayName(Model.wheteverEnum)
不typeof
,不T
,不需要Enums
在视图中添加对命名空间的引用...
可能?
我已经定义了以下内容enum
:
public enum DeviceType
{
[Description("Set Top Box")]
Stb = 1,
Panel = 2,
Monitor = 3,
[Description("Wireless Keyboard")]
WirelessKeyboard = 4
}
Run Code Online (Sandbox Code Playgroud)
我正在利用该Description
属性允许我提取更多用户可读的枚举版本以在UI中显示.我使用以下代码获得描述:
var fieldInfo = DeviceType.Stb.GetType().GetField(DeviceType.Stb.ToString());
var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
var description = (attributes.Length > 0 ? attributes[0].Description : DeviceType.Stb.ToString());
Run Code Online (Sandbox Code Playgroud)
上面的代码将给我:description = "Set Top Box"
.如果没有Description
设置属性,它将为我提供枚举的字符串值.
我现在想为每个枚举添加第二个/自定义属性(为了示例,称为"值").例如:
public enum DeviceType
{
[Description("Set Top Box")]
[Value("19.95")]
Stb = 1,
[Value("99")]
Panel = 2,
[Value("199.99")]
Monitor = 3,
[Description("Wireless Keyboard")]
[Value("20")]
WirelessKeyboard …
Run Code Online (Sandbox Code Playgroud) 在MVC3-Project中,我使用带有display-Attributes的枚举:
public enum Foo {
[Display(Name = "Undefined")]
Undef = 0,
[Display(Name = "Fully colored")]
Full = 1
}
Run Code Online (Sandbox Code Playgroud)
模型类有一个使用此枚举的属性:
public Foo FooProp { get; set; }
Run Code Online (Sandbox Code Playgroud)
视图使用模型类并通过显示属性
@Html.DisplayFor(m => m.FooProp)
Run Code Online (Sandbox Code Playgroud)
现在,最后,我的问题:
我如何使.DisplayFor()显示Display-Attribute中的字符串而不是仅显示枚举的值名称?(它应显示"未定义"或"全彩色",但显示"Undef"或"Full").
谢谢你的提示!
我有以下类domain和Dto类:
public class Profile
{
public string Name { get; set; }
public string SchoolGrade { get; set; }
}
public class ProfileDTO
{
public string Name { get; set; }
public SchoolGradeDTO SchoolGrade { get; set; }
}
public enum SchoolGradeDTO
{
[Display(Name = "Level One"]
LevelOne,
[Display(Name = "Level Two"]
LevelTwo,
}
Run Code Online (Sandbox Code Playgroud)
我使用以下方法:
Mapper.CreateMap<Profile, ProfileDTO>()
.ForMember(d => d.SchoolGrade , op => op.MapFrom(o => o.SchoolGrade))
Run Code Online (Sandbox Code Playgroud)
之后,我收到以下错误:
未找到请求的值"二级".
如何正确映射?
我有这样一个公众enum
:
public enum occupancyTimeline
{
TwelveMonths,
FourteenMonths,
SixteenMonths,
EighteenMonths
}
Run Code Online (Sandbox Code Playgroud)
我将用于这样的DropDown
菜单:
@Html.DropDownListFor(model => model.occupancyTimeline,
new SelectList(Enum.GetValues(typeof(CentralParkLCPreview.Models.occupancyTimeline))), "")
Run Code Online (Sandbox Code Playgroud)
现在我正在寻找我的价值观
12个月,14个月,16个月,18个月而不是TweleveMonths,十四个月,十六个月,十八个月
我怎么做到这一点?
我有一个带显示描述属性的枚举,
public enum CSSColours
{
[Display(Description = "bg-green")]
Green,
[Display(Description = "bg-blue")]
Blue,
}
Run Code Online (Sandbox Code Playgroud)
现在我想将此枚举绑定到DropDownlist,在下拉项目显示文本和描述中显示枚举值(绿色,蓝色)作为项目值(bg-green,bg-blue).
当我使用EnumDropDownListFor
帮助方法绑定Dropdown时
@Html.EnumDropDownListFor(c => dm.BgColor)
Run Code Online (Sandbox Code Playgroud)
它将项值设置为枚举值(0,1),并且找不到将值设置为显示描述的方法.
如何将值设置为Enum Display Description属性?
我有一些国家的枚举:
public enum Countries
{
USA,
Canada,
Mexico,
}
Run Code Online (Sandbox Code Playgroud)
然后我在我的模型上有一个属性:
[Required]
public string Country { get; set; }
Run Code Online (Sandbox Code Playgroud)
在我看来,我有:
@Html.DropDownList("Country", Html.GetEnumSelectList(typeof(Countries)) ...)
Run Code Online (Sandbox Code Playgroud)
我想value
每一个option
在生成select
是从每个项目的名称Countries
enum
.默认情况下,该值是从零开始的整数.
这是我的枚举.
public enum ContractType
{
[Display(Name = "Permanent")]
Permanent= 1,
[Display(Name = "Part Time")]
PartTime= 2,
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用下面的代码获取显示名称.
string x = Enum.GetName(typeof(ContractType), 2);
Run Code Online (Sandbox Code Playgroud)
但它总是返回" PartTime ".其实我想得到display属性的名称.对于上面的示例,x应分配为Part Time
我看到有大量代码的解决方案.这不是简单/一线解决方案吗?
请告诉我一个方向.
我有一个带有 Display(Name=) 的枚举,我希望在 Razor 视图中显示它,但我只得到了值。
public enum Gender
{
[Display(Name = "Man woman")]
EveryOne = 0,
[Display(Name = "Man")]
Man = 1,
[Display(Name = "Woman")]
Woman = 2
}
Run Code Online (Sandbox Code Playgroud)
剃刀:
Is for: @Model.LectureGig.Gender
Run Code Online (Sandbox Code Playgroud)
Html 结果是:
适用于:所有人
代替:
适用于: 男人 女人
我创建了这个枚举
public enum Days
{
[Display("Monday")]
Mon,
[Display("Tuesday")]
Tue,
[Display("Wednesday")]
Wed,
[Display("Thursday")]
Thu,
[Display("Friday")]
Fri,
[Display("Satrday")]
Sat,
}
Run Code Online (Sandbox Code Playgroud)
我想得到字符串"星期一".我试过这样做
Console.WriteLine(Days.mon);
Run Code Online (Sandbox Code Playgroud)
但是给了我"星期一"而不是"星期一".星期一有没有办法获得字符串?
如何使用包含空格的枚举项名称?
enum Coolness
{
Not So Cool = 1,
VeryCool = 2,
Supercool = 3
}
Run Code Online (Sandbox Code Playgroud)
我通过下面的代码获取Enum项目名称
string enumText = ((Coolness)1).ToString()
Run Code Online (Sandbox Code Playgroud)
我不会改变这段代码,但上面的代码应该返回Not So Cool.有没有使用oops概念来实现这一目标?在这里,我不想更改检索语句.
c# ×9
enums ×9
asp.net-mvc ×4
.net ×3
razor ×3
asp.net ×1
asp.net-core ×1
attributes ×1
automapper ×1
c#-4.0 ×1
generics ×1
oop ×1
reflection ×1