C# 如果属性==null,则DataAnnotations可写
我拥有以下财产:C# 如果属性==null,则DataAnnotations可写,c#,data-annotations,C#,Data Annotations,我拥有以下财产: public virtual String Firstname { get; set; } 我只想在字段当前为空(未设置)时写入该字段,这可以通过DataAnnotation实现吗?数据批注是用于验证的元数据,因此您可以创建自定义数据批注来验证属性值,但验证无法确保在属性已经有值时不会设置属性。这是应该作为属性setter本身的一部分的代码,如: private string _firstName; public string FirstName { get
public virtual String Firstname { get; set; }
我只想在字段当前为空(未设置)时写入该字段,这可以通过DataAnnotation实现吗?数据批注是用于验证的元数据,因此您可以创建自定义数据批注来验证属性值,但验证无法确保在属性已经有值时不会设置属性。这是应该作为属性setter本身的一部分的代码,如:
private string _firstName;
public string FirstName
{
get
{
return _firstName;
}
set
{
if (_firstName != null) throw ...
_firstName = value;
}
}
如果数据注释只是指属性,那么答案是:它可以通过属性实现,但是您需要实现一些与属性相关的逻辑。这通常是通过面向方面编程(AOP)完成的,在AOP中,您将创建一些复杂API将使用的标记属性。API将基于该属性在编译时(例如PostSharp)或运行时(例如Unity、Spring.NET)使用自定义代码包装类,添加
if
语句.数据批注是用于验证的元数据,因此您可以创建自定义数据批注来验证属性值,但验证无法确保在属性已具有值的情况下不会设置属性。这是应该作为属性setter本身的一部分的代码,如:
private string _firstName;
public string FirstName
{
get
{
return _firstName;
}
set
{
if (_firstName != null) throw ...
_firstName = value;
}
}
如果数据注释只是指属性,那么答案是:它可以通过属性实现,但是您需要实现一些与属性相关的逻辑。这通常是通过面向方面编程(AOP)完成的,在AOP中,您将创建一些复杂API将使用的标记属性。API将基于该属性在编译时(例如PostSharp)或运行时(例如Unity、Spring.NET)使用自定义代码为类包装
if
语句。实现这一点的另一种方法,我认为更优雅的方法是,不要为属性实现set
,而只实现get
私有字符串_firstName
public string FirstName
{
get
{
return _firstName;
}
}
并具有以下功能:
public void SetFirstName(string FirstName)
{
_firstName = FirstName;
}
所以没有异常,没有返回值处理。您有一个属性,即惟一的retrieve
值,还有一个函数或构造函数(为什么不呢,取决于您的体系结构,很难从post中扣除),它只初始化了一次
在我看来,通过这种方式,您的对象的API将更加清晰和直观
问候。实现这一点的另一种方法,我认为更优雅的是,不要为属性实现
set
,而只实现get
私有字符串_firstName
public string FirstName
{
get
{
return _firstName;
}
}
并具有以下功能:
public void SetFirstName(string FirstName)
{
_firstName = FirstName;
}
所以没有异常,没有返回值处理。您有一个属性,即惟一的retrieve
值,还有一个函数或构造函数(为什么不呢,取决于您的体系结构,很难从post中扣除),它只初始化了一次
在我看来,通过这种方式,您的对象的API将更加清晰和直观
关于。还有一个特定的DataAnnotation语法来实现这一点:
[DisplayFormat(NullDisplayText = "some string")]
public virtual String Firstname { get; set; }
还有一种特定的DataAnnotation语法可以实现这一点:
[DisplayFormat(NullDisplayText = "some string")]
public virtual String Firstname { get; set; }