以下を参照してください。Model
別の から継承する 1 つのクラスを作成BaseModel
し、 new キーワードを使用してから、各インスタンスの 1 つを検証しました。私が見る限り、どちらも base 属性を使用しています。
ControlModel
検証ルーチンを明確にするために、制御クラスを追加しました。
class Program
{
static void Main(string[] args)
{
ValidationTest<Model>();
ValidationTest<BaseModel>();
ValidationTest<ControlModel>();
Console.Read();
}
private static void WriteAttributeInfo<T>()
{
Console.WriteLine(string.Concat(typeof(T), " attributes:"));
typeof(T).GetProperties().SelectMany(m => m.GetCustomAttributes(true)).Select(a => { Console.WriteLine(a); return a; }).ToList();
}
private static void ValidationTest<T>()
{
object obj = Activator.CreateInstance<T>();
Console.WriteLine(string.Concat(typeof(T), " test: isValid = ", Validator.TryValidateObject(obj, new ValidationContext(obj, serviceProvider: null, items: null), new List<ValidationResult>())));
}
}
class ControlModel
{
public string FirstName { get; set; }
public string Email { get; set; }
}
class BaseModel
{
[RequiredAttribute]
public virtual string FirstName { get; set; }
[RequiredAttribute]
public virtual string Email { get; set; }
}
class Model : BaseModel
{
public new string FirstName { get; set; }
public new string Email { get; set; }
}
ConsoleApplication1.Model テスト: isValid = False
ConsoleApplication1.BaseModel テスト: isValid = False
ConsoleApplication1.ControlModel テスト: isValid = True
この例から、継承された必要な検証 (まだ他のものを試していない) 属性をオーバーライド/非表示/無視することはできないようです。