次のようなカスタム ValidationAttribute があります。
public class ReceiverRegion : ValidationAttribute
{
private RegionService regionService;
private CityService cityService;
public ReceiverRegion() : base("Incorrect region code")
{
this.regionService = new RegionService();
this.cityService = new CityService();
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
int regionId = Convert.ToInt32(value);
int plate = Convert.ToInt32((validationContext.ObjectInstance as CorporateOrderItem).ReceiverCity);
int productGroupId = Convert.ToInt32(validationContext.Items["productGroup"].ToString());
if (!CheckReceiverRegionExistence(regionId, plate, productGroupId))
{
IEnumerable regions = this.regionService.GetList(cityService.GetByPlate(plate).PKCityId);
return new CorporateOrderValidationResult(base.ErrorMessage, regions.Select(r=>r.Name));
}
return CorporateOrderValidationResult.Success;
}
private bool CheckReceiverRegionExistence(int plate, int regionId, int productGroup)
{
return !(regionService.GetByCityAndRegionIdForProductGroup(plate, regionId, productGroup) == null);
}
}
しかし、IsValid メソッドでわかるように、ValidationResult を継承するカスタム オブジェクトを返そうとしています。私の問題は、CorporateOrderValidationResult
IsValid がベース ValidationResult タイプを返すため、インスタンスの余分なメンバーにアクセスできないことです。以下は、validate を呼び出して ValidationResult のコレクションを戻り値として取得するコードです。
List results = new List();
bool isValid = Validator.TryValidateObject(instance, context, results, true);
結果オブジェクトを にキャストしようとしましたList<CorporateOrderValidationResult>
が、何を試しても (たとえば -->item as CorporateOrderValidationResult
またはInvalidCastExceptionresults.OfType<CorporateOrderValidationResult>()
または(CorporateOrderValidationResult)item)
null 値を取得します。この結果のリストをカスタム結果クラスのリストに変換する方法はありますか?ありがとう...