2013-07-12 2 views
0

У меня есть класс, называемый сказатьПользовательский атрибут, чтобы изменить значение свойства

Class1 
    public string store { get; set; } 

То, что я хочу, чтобы украсить его чем-то вроде этого;

Class1 
    [GetStoreNumberFromName] 
    [IsNumeric] 
    public string store {get; set; } 

Таким образом, значение может быть 1234, или это может быть 1234 - Store name

Что мне нужно сделать, это проверить, если передаваемое значение имеет только цифры в нем. Если это не так, мне нужно, во втором примере, захватить первые 4 chrs и изменить значение свойства на это.

Так, если передаваемые в значении было 1234 - Store Name затем в конце [GetStoreNumberFromName] значение store должно быть 1234 так, что [IsNumeric] будет проходить в силе.

+0

В чем разница между обработкой этого в отдельном классе и написанием класса, который выполняет итерации по атрибутам? Являются ли атрибуты немного излишними для вашего требования? –

+0

@SimonWhitehead, на самом деле не слишком, потому что я использую их в классе для проверки, сообщений об ошибках и требуется ли это поле. Поэтому я хотел бы перехватить значение и изменить его, чтобы нормальная проверка могла передать значение и не подвела его – griegs

ответ

0

Хорошо .. надеюсь, я понял ваше требование:

class GetStoreNumberFromNameAttribute : Attribute { 
} 

class Class1 { 
    [GetStoreNumberFromName] 
    public string store { get; set; } 
} 

class Validator<T> 
{ 
    public bool IsValid(T obj) 
    { 
     var propertiesWithAttribute = typeof(T) 
             .GetProperties() 
             .Where(x => Attribute.IsDefined(x, typeof(GetStoreNumberFromNameAttribute))); 

     foreach (var property in propertiesWithAttribute) 
     { 
      if (!Regex.Match(property.GetValue(obj).ToString(), @"^\d+$").Success) 
      { 
       property.SetValue(obj, Regex.Match(property.GetValue(obj).ToString(), @"\d+").Groups[0].Value); 
      } 
     } 

     return true; 
    } 
} 

..usage:

var obj = new Class1() { store = "1234 - Test" }; 
Validator<Class1> validator = new Validator<Class1>(); 
validator.IsValid(obj); 

Console.WriteLine(obj.store); // prints "1234" 

..obviously нужны некоторые изменения на вашем конце .. но это должно дать вам идея (я знаю, что метод наименования, вероятно, не самый лучший ..: /)

Если я пропустил этот пункт, дайте мне знать, и я удалю.