簡體   English   中英

如何檢索自定義C#資源類常量的字符串值?

[英]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的構造函數中的minDatemaxDate參數值(分別)。

如果我試試

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM