C# 模型的自定义设置器

Posted

技术标签:

【中文标题】C# 模型的自定义设置器【英文标题】:Custom setter for C# model 【发布时间】:2012-10-10 22:48:07 【问题描述】:

我不知道如何为 C# 数据模型制作自定义设置器。场景很简单,我希望我的密码使用 SHA256 函数自动加密。 SHA256 函数效果很好(我之前在无数项目中使用过)。

我已经尝试了几件事,但是当我运行 update-database 时,它似乎正在递归地做一些事情,我的 Visual Studio 挂起(不要发送错误)。请帮助我了解如何在模型中默认加密密码。

我已经尝试过的代码

public class Administrator

    public int ID  get; set; 
    [Required]
    public string Username  get; set; 
    [Required]
    public string Password
    
        get
        
            return this.Password;
        

        set
        
            // All this code is crashing Visual Studio

            // value = Infrastructure.Encryption.SHA256(value);
            // Password = Infrastructure.Encryption.SHA256(value);
            // this.Password = Infrastructure.Encryption.SHA256(value);
        
    

种子

context.Administrators.AddOrUpdate(x => x.Username, new Administrator  Username = "admin", Password = "123" );

【问题讨论】:

您是否尝试将访问器设置为自身? Password = XXX 会调用 Password 的 Set Accessor,它会再次调用它……如果让 VS 运行足够长的时间,我猜你会出现堆栈溢出。你有一个实际的字段来存储你的密码吗? @Marc-AndréJutras 确实它递归地做了一些我怀疑的事情,但是我怎样才能做到这一点呢? 您用来存储密码的字段是什么?访问器不是字段,而是伪装的方法。 【参考方案1】:

您需要使用私有成员变量作为支持字段。这允许您单独存储值并在设置器中对其进行操作。

好资料here

public class Administrator

    public int ID  get; set; 

    [Required]
    public string Username  get; set; 

    private string _password;

    [Required]
    public string Password
    
        get
        
            return this._password;
        

        set
          
             _password = Infrastructure.Encryption.SHA256(value);                
        
    

【讨论】:

【参考方案2】:

您使用的 get 和 set 实际上是创建称为 get_Password()set_Password(password) 的方法。

您希望将实际密码存储在私有变量中。因此,只有一个由这些“方法”返回和更新的私有变量是可行的方法。

public class Administrator

public int ID  get; set; 
[Required]
public string Username  get; set; 
[Required]
private string password;
public string Password

    get
    
        return this.password;
    

    set
    
        this.password = Infrastructure.Encryption.SHA256(value);
    


【讨论】:

以上是关于C# 模型的自定义设置器的主要内容,如果未能解决你的问题,请参考以下文章

如何让 qt 设计器自定义 QOpenGLWidget 小部件背景透明?

配置 WSO2 API 管理器自定义身份验证器和声明

Google 跟踪代码管理器自定义变量返回未定义

使用epplus c#设置Excel工作表单元格的自定义BackgroundColor

类别中的自定义 NSManagedObject 设置器

C#的自定义滚动条