我的问题是:我有一个枚举类:
extension NSDate
{
func isBetweenDates(beginDate: NSDate, endDate: NSDate) -> Bool
{
if self.compare(beginDate) == .OrderedAscending
{
return false
}
if self.compare(endDate) == .OrderedDescending
{
return false
}
return true
}
}
我还有一个用于创建新用户的模型。在我们创建新用户时,可以在任何这些应用程序中将用户定义为“活动”。
我的模特是:
public enum EnumApplications
{
Android = 1,
IOS = 2
}
我想要做的是:public class NewUserModel
{
public int UserId { get; set; }
[Required]
[Display(Name = "FirstName")]
public string FirstName { get; set; }
[Required]
[Display(Name = "LastName")]
public string LastName { get; set; }
public int ClientId { get; set; }
[Required]
[Display(Name = "Email")]
[EmailAddress]
public string EmailAddress { get; set; }
[Display(Name = "Is Active in IOS")]
public bool IsActiveInApp1 { get; set; }
[Display(Name = "Is Active in Android")]
public bool IsActiveInApp2 { get; set; }
}
我想使用枚举,所以如果应用名称被更改,我不需要在这里更改它,例如:
[Display(Name = "Is Active in Android")]
以下是更好理解的屏幕截图:
答案 0 :(得分:1)
“我想使用枚举,所以如果应用名称发生变化,我不需要在这里更改”
不,没有简单的方法可以做到这一点。
我能想到的唯一实现(除了运行时汇编/类型编译和生成),你可以做到这一点,是一个T4模板。模板会生成模型,您必须在修改enum
后运行它。
关于你的问题标题和评论:
MVC - 在Model类的DisplayAttribute中使用Enum
我想要的是在我的模型中,而不是说[显示(名称=“在IOS中是活动的”)]和硬编码IOS。我想从我的枚举中获取IOS的名称。
以下解决方案(不是T4或运行时编译)只是继承DisplayNameAttribute
并使用您的类型的构造函数将参数传递给基类型。
这是一个解决方案,如果您要将Android
更改为Andy
,您将使用重构工具(最近内置的智能感知工具)来实现跨代码文件的更改引用该值类型。
public enum MyEnum
{
NotSet = 0,
iOS = 1,
Android = 2
}
class MyDisplayNameAttribute : System.ComponentModel.DisplayNameAttribute
{
public MyDisplayNameAttribute(MyEnum myEnum)
: base("Is Active in " + myEnum.ToString())
{
}
public override string DisplayName
{
get
{
// you could do the "Is Active in " here, but I doubt control frameworks would use it.
return base.DisplayName;
}
}
}
public class MyModel
{
[MyDisplayName(MyEnum.iOS)]
bool IsActiveApp1 { get; set; }
// uses standard 'DisplayNameAttribute' type for test below
[System.ComponentModel.DisplayName("Is Active in Android")]
bool IsActiveApp2 { get; set; }
}
为了快速测试,我们将执行控制框架的操作,反映提供的类型并获取CustomAttribute ..请注意,涉及更多类型检查,为简洁起见,我们将其转换为DisplayNameAttribute
。
string[] PropertyNames = new string[] { "IsActiveApp1", "IsActiveApp2" };
System.Type MyModelInfo = typeof(MyModel);
PropertyNames.SelectMany(prop => MyModelInfo.GetProperty(prop).GetCustomAttributes(true))
.ToList().ForEach((attr) =>
{
Console.WriteLine(((System.ComponentModel.DisplayNameAttribute)attr).DisplayName);
});