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