如何通过自定义属性获取和修改属性值?

Dav*_*enn 16 c# asp.net-mvc

我想创建一个可以在以下属性上使用的自定义属性:

[TrimInputString]
public string FirstName { get; set; }
Run Code Online (Sandbox Code Playgroud)

这将是功能相当于

private string _firstName
public string FirstName {
  set {
    _firstName = value.Trim();
  }
  get {
    return _firstName;
  }
}
Run Code Online (Sandbox Code Playgroud)

所以基本上每次设置属性时都会修剪该值.

如何获取解析的值,修改该值,然后使用属性中的新值全部设置属性?

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

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

}
Run Code Online (Sandbox Code Playgroud)

Pra*_*sad 11

我这样做,不是很有说服力的方式,但它的工作

演示课

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; }

}
Run Code Online (Sandbox Code Playgroud)

为LowerCase编写属性,其他可以用类似的方式编写

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

不是很优雅的方式,因为它实际上实现Validation属性,但它的工作原理

  • 也许你想要`return ValidationResult.Success;` (4认同)

Mat*_*nen 8

这不是属性的工作方式.您无法从构造函数中访问属性所附加的任何内容.

如果你想使这个工作,你需要制作一些传递对象的处理器类,然后通过字段并根据属性做一些事情.可以在属性中定义要执行的操作(这里抽象的基本属性很方便),但是您仍然需要手动遍历字段以应用操作.