2013-07-12 72 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需要在您的最終一些變化..但它應該給你一個想法(我知道方法命名可能不是最好的..:/)

如果我錯過了這一點完全讓我知道,我會刪除。