Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C依赖属性,依赖于setter执行的正确顺序_C#_Oop_Properties_Xaf - Fatal编程技术网

C# C依赖属性,依赖于setter执行的正确顺序

C# C依赖属性,依赖于setter执行的正确顺序,c#,oop,properties,xaf,C#,Oop,Properties,Xaf,我想知道如何处理C中的依赖属性。我正在使用以下简化类: 将公司分配给员工时,为了方便起见,我将Employee.PreferredContactMethod设置为公司的PreferredContactMethod,以后可以更改 更新: 我想在初始化新员工时使用Company.PreferredContactMethod作为默认值。每个员工都独立于公司存储自己的联系方式。以后对Company.PreferredContactMethod的更改不应更新Employee.PreferredContac

我想知道如何处理C中的依赖属性。我正在使用以下简化类:

将公司分配给员工时,为了方便起见,我将Employee.PreferredContactMethod设置为公司的PreferredContactMethod,以后可以更改

更新: 我想在初始化新员工时使用Company.PreferredContactMethod作为默认值。每个员工都独立于公司存储自己的联系方式。以后对Company.PreferredContactMethod的更改不应更新Employee.PreferredContactMethod。Employee.PreferredContactMethod为null是完全合法的,例如,如果显式设置为user

非常简单的代码,当然这只是工作良好。但我认为这违反了:

即使这样会导致错误,也不要允许按任何顺序设置属性 临时无效的对象状态

Company=A,PreferredContactMethod=null给出的结果与PreferredContactMethod=null,Company=A不同

我认为我不能依赖属性设置器的“正确”顺序,例如,如果使用自动映射/反射,您如何处理这种情况?我认为这并不罕见


谢谢大家!

您希望确保该员工的首选联系人方法与该公司自己的首选联系人方法相同,除非他自己有指定的首选联系人方法。扩展解决方案的一种方法是实现这一点,即像这样更新此值:

public class Employee
{
    private Company company;
    public Company Company
    {
        get { return this.company; }
        set
        {
            this.company = value;
            UpdateCompanyPreferredContactMethod();
        }
    }

    private ContactMethods? preferredContactMethod;
    public ContactMethods? PreferredContactMethod 
    {
        get { return this.preferredContactMethod; }
        set
        {
            this.preferredContactMethod = value;
            UpdateCompanyPreferredContactMethod();
        }
    }

    private void UpdateCompanyPreferredContactMethod()
    {
        if (PreferredContactMethod == null)
        {
            PreferredContactMethod = company != null ?company.PreferredContactMethod : null;
        }
    }
}
public class Employee
{
    public Company Company { get; set; }

    private ContactMethods? preferredContactMethod;
    public ContactMethods? PreferredContactMethod 
    {
        get 
        { 
            if (this.preferredContactMethod != null)
            {
                return this.preferredContactMethod;
            }
            else if (this.Company != null)
            {
                return this.Company.PreferredContactMethod;
            }
            else
            {
                return null;
            }
        }
        set { this.preferredContactMethod = value; }
    }
}
但是,此解决方案是脆弱的,因为每次更改时都必须更新此值。相反,我实际上会这样做:

public class Employee
{
    private Company company;
    public Company Company
    {
        get { return this.company; }
        set
        {
            this.company = value;
            UpdateCompanyPreferredContactMethod();
        }
    }

    private ContactMethods? preferredContactMethod;
    public ContactMethods? PreferredContactMethod 
    {
        get { return this.preferredContactMethod; }
        set
        {
            this.preferredContactMethod = value;
            UpdateCompanyPreferredContactMethod();
        }
    }

    private void UpdateCompanyPreferredContactMethod()
    {
        if (PreferredContactMethod == null)
        {
            PreferredContactMethod = company != null ?company.PreferredContactMethod : null;
        }
    }
}
public class Employee
{
    public Company Company { get; set; }

    private ContactMethods? preferredContactMethod;
    public ContactMethods? PreferredContactMethod 
    {
        get 
        { 
            if (this.preferredContactMethod != null)
            {
                return this.preferredContactMethod;
            }
            else if (this.Company != null)
            {
                return this.Company.PreferredContactMethod;
            }
            else
            {
                return null;
            }
        }
        set { this.preferredContactMethod = value; }
    }
}

您说您想在初始化新员工时使用PreferredContactMethod作为默认值。如果是这种情况,您应该将公司传递给员工的构造函数,然后设置:

public Employee(Company company) {
    // Null checks as appropriate
    this.company = company;
    this.PreferredContactMethod = company.PreferredContactMethod;
}

如果您还想更改PreferredContactMethod,而您唯一关心的是违反设计准则,然后,可以使用Employee.SetCompany方法来指示该操作除了仅更改公司属性之外还有副作用。

我认为您需要在保存Employee对象之前分配它,因此任何订单都会给出相同的结果

试试这个

if (IsNewRecord && Company != null && PreferredContactMethod == null)
    PreferredContactMethod = Company.PreferredContactMethod;

您是否希望员工的首选联系方式始终与公司的相匹配?如果调用Employee.PreferredContactMethod上的setter,会不会影响Company.PreferredContactMethod的价值?也许您可以为员工使用自定义getter,即Employee.PreferredContactMethod返回Employee.company.PreferredContactMethod?我更新了我的要求。我希望现在更清楚了。我经常在我的业务对象中使用类似的代码。我认为我的需求只是为了方便而将属性初始化为默认值,这在某种程度上与UI有关。也许使用一些UI控制器代码是更好的方法?你觉得呢?我喜欢你的后一个例子,但我想强调的是,OP应该考虑他/她的设计要求。特别是,Employee.PreferredContactMethod何时应与Company.PreferredContactMethod相对应?谢谢golergka,很好的解决方案。但我认为它不符合我更新的要求。不幸的是,我不能使用构造函数方法。在我使用XAF的框架中,不存在真正的视图模型。GUI会自动创建并绑定到持久类。将生成一个Employees Listview和一个“New Employee”操作,以在DetailView中构造一个新的空员工。在DetailView中,编辑器是为所有公共属性创建的,但不是为方法创建的,因此我无法轻松使用SetCompany方法。为员工创建了两个编辑器:“公司”查找和“首选联系人方法”查找。我想没有某种视图模型就没有好的解决方案?!嗯,不确定我是否理解你的答案。在XAF/XPO中有一种虚拟的保存方法。我应该重写它并添加代码吗?但是,如果有人将“PreferredContactMethod”显式设置为null,您的代码将覆盖它……没错,因此您需要额外的控件来处理这种情况。