我有以下属性:
public virtual String Firstname { get; set; }
我只希望能够写入该字段,如果它当前为空(未设置),这可以通过DataAnnotations实现吗?
答案 0 :(得分:4)
数据注释是用于验证的元数据,因此您可以创建自定义数据注释来验证属性值,但验证无法确保如果属性已经具有值,则不会设置该属性。这是代码,它应该是属性的setter本身的一部分,如:
private string _firstName;
public string FirstName
{
get
{
return _firstName;
}
set
{
if (_firstName != null) throw ...
_firstName = value;
}
}
如果通过数据注释你只是意味着属性,那么答案是:它可以通过属性实现,但是你需要一些能够实现与属性相关的逻辑的东西。这通常通过面向方面编程(AOP)来完成,您将在其中创建将由某些复杂API使用的标记属性。 API将基于该属性用自定义代码包装您的类,在编译时(例如PostSharp)或运行时(例如Unity,Spring.NET)添加if
语句。
答案 1 :(得分:1)
通过我更优雅的另一种方式来实现这一点,不要为该属性实现set
,而只是get
private string _firstName;
public string FirstName
{
get
{
return _firstName;
}
}
并有一个功能:
public void SetFirstName(string FirstName)
{
_firstName = FirstName;
}
所以没有例外,没有返回值处理。您有一个属性唯一的retrieve
值,一个函数或构造函数(为什么不,取决于您的体系结构,很难从帖子中扣除) 初始化只有一次。
通过我,您的对象的API将以这种方式更加清晰明了。
问候。
答案 2 :(得分:0)
还有一种特定的DataAnnotation语法来实现这一目标:
(i_min, i_max)