2016-08-05 94 views
0

我面臨驗證其驗證屬性與相應字段名稱關聯的屬性的問題。C#從屬性中檢索字段名

int _myIntField; 
public int MyIntField { 
    get { return _myIntField; } 
    set { _myIntField = value; } 
} 

現在,在驗證Binding對象的時候,我有機會獲得BindingField,它返回屬性名MyIntField,而不是字段名_myIntField

是否有可能以某種方式檢索_myIntField的財產?如果是這樣,怎麼樣?

+1

那麼如果你的命名規則是堅實的,你可能只是做了更換的第一個字母...'字符串名稱=「_」 + Char.ToLowerInvariant(輸入[0])+ input.Substring (1);' – musefan

+1

你可能可以去Roslyn了。至於這樣做的工廠方式,請考慮以下內容:'int Foo {get {return _bar * _baz> 0? _pete:_barney; }}。 「Foo」的領域是什麼?你可以選擇編寫代碼來對這個問題作出一個假設或另一個假設,但是.NET框架無法做出任何對每個人都有意義或有用的假設。 –

+0

[如何從PropertyInfo獲取Getter後臺字段?](http://stackoverflow.com/questions/38490739/how-to-get-getter-backing-field-from-propertyinfo) – thehennyy

回答

0

其實,對於我來說,我有一個變通:我創建了一個自定義屬性採取相關的字段名作爲參數...

int _myIntField; 
[MyAttribue("_myIntField")] 
public int MyIntField { 
    get { return _myIntField; } 
    set { _myIntField = value; } 
} 

爲了完整起見,這裏是屬性的聲明:

public class MyAttribue : ValidationAttribute { 
    protected readonly string _fieldName; 

    public MyAttribue(string fldName) { 
     _fieldName = fldName; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) { 
     if (validationContext == null) { 
     return ValidationResult.Success; 
     } 
     ErrorMessage = string.Empty; 

     if (validationContext.ObjectInstance != null) { 
     // do whathever validation is required using _fieldName... 
     } 
     // 
     if (!string.IsNullOrWhiteSpace(ErrorMessage)) { 
     return new ValidationResult(ErrorMessage); 
     } 
     return ValidationResult.Success; 
    } 
    }