我想创建一个可以在以下属性上使用的自定义属性:
[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属性,但它的工作原理
这不是属性的工作方式.您无法从构造函数中访问属性所附加的任何内容.
如果你想使这个工作,你需要制作一些传递对象的处理器类,然后通过字段并根据属性做一些事情.可以在属性中定义要执行的操作(这里抽象的基本属性很方便),但是您仍然需要手动遍历字段以应用操作.
| 归档时间: |
|
| 查看次数: |
16778 次 |
| 最近记录: |