如何检索自定义C#资源类常量的字符串值



我创建了以下自定义ValidationAttribute:

public class DateRangeAttribute : ValidationAttribute, IClientValidatable {
public DateTime MinimumDate = new DateTime(1901, 1, 1);
public DateTime MaximumDate = new DateTime(2099, 12, 31);
public DateRangeAttribute(string minDate, string maxDate, string errorMessage) {
MinimumDate = DateTime.Parse(minDate);
MaximumDate = DateTime.Parse(maxDate);
ErrorMessage = string.Format(errorMessage, MinimumDate.ToString("MM/dd/yyyy"), MaximumDate.ToString("MM/dd/yyyy"));
}
}

我想在我的MVC4视图模型中使用如下:

[DateRange(Resources.MinimumDate, Resources.MaximumDate, "Please enter a date between {0} and {1}")]

Resources是基于存储在SQL数据库中的一组选项生成的资源类。为上述两个资源属性生成的代码的简化版本是:

public class Resources {
public const string MinimumDate = "PropMinimumDate";
public static string PropMinimumDate
{
get { return "12/15/2010" } 
}
public const string MaximumDate = "PropMaximumDate";
public static string PropMaximumDate
{
get { return "12/15/2012" } 
}
}

虽然我不知道它是如何工作的,但我知道ValidationAttributes中资源的典型使用会自动将resources.MinimumDate映射到PropMinimumDate,并返回值"12/15/2010"。

我不知道如何自己手动进行编程跳跃,这样我就可以将这两个日期值传递到我的自定义斜坡中。按照当前编码,"PropMinimumDate"one_answers"PropMaximumDate"分别是传递到DateRangeAttribute构造函数中的minDate参数值和

maxDate如果我尝试

[DateRange(Resources.PropMinimumDate, Resources.PropMaximumDate, "Please enter a date between {0} and {1}")]

我收到编译错误:

属性参数必须是属性参数类型的常量表达式、typeof表达式或数组创建表达式

有没有办法完成这项任务,或者我正在尝试不可能的事情?

您需要将资源类的Type作为参数,然后使用反射来获取属性值。

public class DateRangeAttribute : ValidationAttribute, IClientValidatable {
public DateTime MinimumDate = new DateTime(1901, 1, 1);
public DateTime MaximumDate = new DateTime(2099, 12, 31);
private Type _resourceType;
public DateRangeAttribute(string minDate, string maxDate, string errorMessage, Type resourceType) {
_resourceType = resourceType;
var minDateProp = _resourceType.GetProperty(minDate, 
BindingFlags.Static | BindingFlags.Public);
var minDateValue = (string) minDateProp.GetValue((object) null, (object[]) null));
MinimumDate = DateTime.Parse(minDateValue);
// similarly get the value for MaxDate
ErrorMessage = string.Format(errorMessage, 
MinimumDate.ToString("MM/dd/yyyy"), MaximumDate.ToString("MM/dd/yyyy"));         
}
}

例如

[DateRange(Resources.MinimumDate, Resources.MaximumDate, "Please enter a date between {0} and {1}", typeof(Resources))]

您不是在尝试不可能的事情,但您将不得不稍微绕过限制。因此,为了遵守编译器的要求,我们有两种选择,第一种是最理想的,更改生成的Resources类。

public class Resources {
public const string PropMinimumDate = "12/15/2010";
public const string PropMaximumDate = "12/15/2012";
}

现在,如果我们不能做到这一点,那么我们将走另一条路,让我们修改装饰属性所在的类,并向其添加几个const字段

public class EntityClass
{
private const string MinimumDate = "12/15/2010";
private const string MaximumDate = "12/15/2012";
[DateRange(MinimumDate, MaximumDate, "Please enter a date between {0} and {1}")]
}

但是,除非您可以用代码生成实体类,否则最后一个选项有点违反了从数据库中提取值的需要。因此,希望您可以更改Resources类。

最新更新