2013-07-12 31 views
0

我有一个叫班说自定义属性来更改属性值

Class1 
    public string store { get; set; } 

我要的是像这样的东西来装饰它;

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

所以值可能是1234,也可能是1234 - Store name

我需要做的是检查是否传递的值在它只有数字。如果不是,那么在第二个例子中,我需要抓住前4个字符并将属性值更改为该值。

因此,如果在值传递是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需要在您的最终一些变化..但它应该给你一个想法(我知道方法命名可能不是最好的..:/)

如果我错过了这一点完全让我知道,我会删除。