2016-08-05 50 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; 
    } 
    }