Атрибут сам по себе является просто «декоратором» свойства.Если ничто не вызывает его, он не будет автоматически выполняться или использоваться.
В вашем случае, однако, я не вижу смысла использовать атрибут, когда вы можете использовать само свойство:
private string _name = "";
public string Name
{
get
{
return _name;
}
set
{
if ( string.IsNullOrEmpty(value) )
{
//throw or fallback
}
else
{
_name = value;
}
}
}
Проверка основных значений - это именно то, для чего отлично подходят установщики свойств задания.Если кто-то использует недопустимое значение, вы можете вызвать исключение или установить запасное значение, например.
Если вы все еще предпочитаете использовать атрибуты, вам все равно нужен код, который выполняет саму проверку.И все же любой может присвоить свойству любое допустимое значение, если только проверка не выполнена.
Например, ASP.NET MVC использует проверку атрибутов во время привязки модели - он проверяет атрибуты проверки напривязывает класс модели и проверяет его до начала выполнения метода действия.
Пример проверки атрибута
Вот простой пример того, как заставить ваш код работать с отражением.
Сначала приведем немного обновленную версию атрибута проверки:
[AttributeUsage(AttributeTargets.Property)]
public class NotNullAttribute : Attribute
{
public bool IsValid(object value)
{
if (!string.IsNullOrEmpty(value as string))
{
return false;
}
return true;
}
}
Ваш код на самом деле допускает только значение null
или ""
, которое, я полагаю, противоположно тому, что вы хотели.Эта версия действительна только в том случае, если строка не null
и не пуста.
Теперь создайте метод Validate
в своем классе Program
:
private static bool Validate(object model)
{
foreach (var propertyInfo in model.GetType().GetProperties())
{
foreach (var attribute in propertyInfo.GetCustomAttributes(true))
{
var notNullAttribute = attribute as NotNullAttribute;
if (notNullAttribute != null)
{
if (!notNullAttribute.IsValid(propertyInfo.GetValue(model)))
{
return false;
}
}
}
}
return true;
}
Это в основном собирает всесвойства типа переданного параметра, проверяет все атрибуты свойств для NotNullAttribute
и затем выполняет метод атрибута IsValid
относительно текущего значения из model
.
Наконец, вот как выможно вызвать его с Main
:
static void Main(string[] args)
{
Person p1 = new Person();
p1.Name = "d";
if (Validate(p1))
{
Console.WriteLine("Valid");
}
else
{
Console.WriteLine("Invalid");
}
Console.WriteLine("Validation done");
Console.ReadKey();
}
Теперь, если вы планируете добавить больше атрибутов проверки, я бы сначала создал интерфейс:
public interface IValidationAttribute
{
bool IsValid(object value);
}
Затем извлеките всю вашу проверкуатрибуты из IValidationAttribute
и Validate
метода используют IValidationAttribute
вместо NotNullAttribute
.Таким образом, код становится более ориентированным на будущее, так как вы можете просто программировать для интерфейса и добавлять новые атрибуты проверки в любое время.