2010-05-19 112 views
14

我想創建一個可以像一個屬性可以使用自定義屬性:如何通過自定義屬性獲取和修改屬性值?

[TrimInputString] 
public string FirstName { get; set; } 

,這將是

private string _firstName 
public string FirstName { 
    set { 
    _firstName = value.Trim(); 
    } 
    get { 
    return _firstName; 
    } 
} 

功能等同所以基本上設定值,每次屬性將被削減。

如何獲取解析的值,修改該值,然後使用屬性中的新值設置屬性?

[AttributeUsage(AttributeTargets.Property)] 
public class TrimInputAttribute : Attribute { 

    public TrimInputAttribute() { 
    //not sure how to get and modify the property here 
    } 

} 
+0

我認爲一個更好的方法是一個DataBinder:http://stackoverflow.com/a/1734025/7720 – Romias 2017-04-13 20:16:53

回答

6

這不是屬性的工作方式。您不能從構造函數中訪問任何屬性。

如果你想做這個工作,你需要製作某種類型的處理器類,然後通過它傳遞對象,然後根據屬性執行一些操作。可以在屬性中定義要執行的操作(這裏抽象的基本屬性很方便),但仍然需要手動通過這些字段來應用操作。

1

正如Matti指出的,這不是屬性的工作原理。但是,您可以使用PostSharp AOP framework來完成此操作,可能會覆蓋OnMethodBoundaryAspect。但這不是微不足道的。

7

IAM這樣做,不是非常有說服力的方式,但它的工作

試聽課

public class User 
{ 

[TitleCase] 
public string FirstName { get; set; } 

[TitleCase] 
public string LastName { get; set; } 

[UpperCase] 
public string Salutation { get; set; } 

[LowerCase] 
public string Email { get; set; } 

} 

寫作屬性爲小寫,其他人可以寫在類似的方式

public class LowerCaseAttribute : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     //try to modify text 
      try 
      { 
       validationContext 
       .ObjectType 
       .GetProperty(validationContext.MemberName) 
       .SetValue(validationContext.ObjectInstance, value.ToString().ToLower(), null); 
      } 
      catch (System.Exception) 
      {          
      } 

     //return null to make sure this attribute never say iam invalid 
     return null; 
    } 
} 

不是非常優雅的方式,因爲它實際上實現了驗證屬性b它可以工作

+0

這當然,只有當你的程序在某些點運行驗證對象時纔有效。有趣的黑客攻擊,但我不會在生產代碼中使用它。 – 2015-07-02 19:00:38

+1

也許你會想'返回ValidationResult.Success;' – Nikola 2017-08-23 11:29:11

0

這可以用Dado.ComponentModel.Mutations完成。

public class User 
{ 
    [Trim] 
    public string FirstName { get; set; } 
} 

// Then to preform mutation 
var user = new User() { 
    FirstName = " David Glenn " 
} 

new MutationContext<User>(user).Mutate(); 

你可以看到更多的文檔here

+0

不判斷解決方案本身。但是我覺得選擇的命名空間會讓人誤解。我的第一印象是它是.Net框架本身的一部分。雖然不是。爲什麼不用RoyDukkey.ComponentModel.Mutations來啓動命名空間,同樣也要稱讚你的名字。 – 2017-02-28 08:09:38

+0

我同意。這最初是作爲一項建議而建立的,但是此後一直關閉。我還沒有時間將命名空間改爲更合適的東西。 – roydukkey 2017-03-01 01:33:33

相關問題