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

时间:2010-05-19 09:41:40

标签: c# asp.net-mvc

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

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

功能相当于

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

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

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

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

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

}

4 个答案:

答案 0 :(得分:7)

这不是属性如何运作的。您无法从构造函数中访问属性所附加的任何内容。

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

答案 1 :(得分:7)

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

演示课程

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

}

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

实际上实现Validation属性并不是很优雅,但它可以正常工作

答案 2 :(得分:1)

Matti指出,这不是属性如何运作的。但是,您可以使用PostSharp AOP framework来完成此操作,可能会覆盖OnMethodBoundaryAspect。但这不是微不足道的。

答案 3 :(得分: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

相关问题