开发者

How to get and modify a property value through a custom Attribute?

I want to create a custom attribute that can be used on a property like:

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

that will be functional equivalent of

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

So basically every time property is set the value will be trimmed.

How do I get the value parsed, modify that value and then set the property with the new value all from within the attr开发者_如何学运维ibute?

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

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

}


iam doing this , not very convincing way but its working

demo class

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

}

Writing Attribute for LowerCase, others can be written in the similar manner

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

Not very elegant way as its actually implementing Validation attribute but it works


That's not how attributes work. You can't access whatever the attribute is attached to from within the constructor.

If you want to make this work, you'll need to make some kind of processor class to which you pass the object, which then goes through the fields and does something depending on the attributes. The operation to do may be defined within the attribute (an abstract base attribute is handy here), but you'll still need to go through the fields by hand to apply the operation.


As Matti pointed out, this is not how attributes work. However, you could use the PostSharp AOP framework to accomplish this, probably overriding OnMethodBoundaryAspect. But this is not trivial.


This can be done with 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();

You can see more documentation here.


i had this problem you should use JsonSeralizer attributes it will works

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜