[英]How to retrieve the string value of a custom C# resource class constant?
我創建了以下自定義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”。
我無法弄清楚的是如何自己手動進行程序化跳躍,以便我可以將兩個日期值傳遞到我的自定義ValidatorAttribute中。 如目前編碼, “PropMinimumDate”和“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
類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.