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

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

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

这将是function相当于

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

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

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

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

演示课

 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属性,但它的工作原理

正如马蒂指出的那样,这不是属性如何运作的。 但是,您可以使用PostSharp AOP框架来完成此任务,可能会覆盖OnMethodBoundaryAspect。 但这不是微不足道的。

这可以使用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).Mutate(); 

您可以在此处查看更多文档。