我想创建一个可以在以下属性上使用的自定义属性:
[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
}
}
答案 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。