Атрибуты Validatable Objects и MetadataType используются в частичных классах такими структурами, как, например, MVC.
Вот пример использования атрибута MetadataType:
[MetadataType(typeof(UserMetadata))]
public partial class User
{
private class UserMetadata
{
[DisplayName("User Id")]
public long UserId
{
get;
set;
}
[DisplayName("User Name")]
public string UserName
{
get;
set;
}
}
}
Когда вы используете платформу MVC, любая модель, имеющая эти атрибуты, будет считываться для целей автоматической генерации полей меток для соответствующих дисплеев / редакторов.
Пример использования IValidatableObject
public partial class Apple : IValidatableObject // Assume the Apple class has an IList<Color> property called AvailableColors
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
foreach (var color in this.AvailableColors)
{
if (color.Name == "Blue") // No blue apples, ever!
{
yield return new ValidationResult("You cannot have blue apples.");
}
}
}
}
MVC подхватит этот IValidatableObject и обеспечит, чтобы любое Apple, которое проходит свой этап проверки, никогда не отображалось синим цветом.
РЕДАКТИРОВАТЬ
В качестве примера вашей проблемы с диапазоном дат используется IValidatableObject:
public partial class ObjectWithAStartAndEndDate : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.StartDate >= this.EndDate)
{
yield return new ValidationResult("Start and End dates cannot overlap.");
}
}
}