Да, можно отключить обязательный атрибут. Создайте свой собственный атрибут класса (пример кода с именем ChangeableRequired) для экстента из RequiredAtribute, добавьте свойство Disabled и переопределите метод IsValid, чтобы проверить, отключен ли он. Используйте рефлексию, чтобы установить отключенный poperty, например:
Пользовательский атрибут:
namespace System.ComponentModel.DataAnnotations
{
public class ChangeableRequired : RequiredAttribute
{
public bool Disabled { get; set; }
public override bool IsValid(object value)
{
if (Disabled)
{
return true;
}
return base.IsValid(value);
}
}
}
Обновите вашу собственность, чтобы использовать новый пользовательский атрибут:
class Forex
{
....
[ChangeableRequired]
public decimal? ExchangeRate {get;set;}
....
}
, где вам нужно отключить свойство, используйте его отражение:
Forex forex = new Forex();
// Get Property Descriptor from instance with the Property name
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(forex.GetType())["ExchangeRate"];
//Search for Attribute
ChangeableRequired attrib = (ChangeableRequired)descriptor.Attributes[typeof(ChangeableRequired)];
// Set Attribute to true to Disable
attrib.Disabled = true;
Это приятно и чисто?
NB. Приведенная выше проверка будет отключена, пока экземпляр вашего объекта жив \ active ...