0

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

public class Company
{
    public ContactMethods? PreferredContactMethod { get; set; }
    // Missing: Collection of Employees...
}

public class Employee
{
    private Company company;

    public Company Company
    {
        get
        {
            return this.company;
        }
        set
        {
            company = value;
            if (company != null && PreferredContactMethod == null)
            {
                PreferredContactMethod = company.PreferredContactMethod;
            }
        }
    }

    public ContactMethods? PreferredContactMethod { get; set; }
}

在将 Company 分配给 Employee 时,我将 Employee.PreferredContactMethod 设置为 Company 的 PreferredContactMethod(只是为了方便,以后可以更改)。


更新:

我想在初始化新员工时使用 Company.PreferredContactMethod 作为默认值。每个员工都独立于公司存储自己的 ContactMethod。以后对 Company.PreferredContactMethod 的更改不应更新 Employee.PreferredContactMethod。Employee.PreferredContactMethod 为空是完全合法的(例如,如果明确设置为用户)。


非常简单的代码,当然这很好用。但我认为它违反了微软的 Property Design Guidelines

允许以任何顺序设置属性,即使这会导致临时无效的对象状态。

Company = A, PreferredContactMethod = null给出另一个结果,而不是PreferredContactMethod = null, Company = A.

我认为我不能依赖属性设置器的“正确”顺序(例如,如果使用 Automapper/Reflection),您如何处理这种情况?我认为这并不少见。

谢谢!

4

3 回答 3

0

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

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

如果您还想以您的方式更改 PreferredContactMethod,并且您唯一担心的是违反设计准则,那么除了仅更改属性之外,还可以使用一种方法Employee.SetCompany来指示该操作具有副作用。Company

于 2015-04-16T13:43:32.447 回答
0

您要确保 Employee 具有与该公司自己相同的 PreferredContactMethod 的不变量,除非他自己具有指定的 PreferredContancMethod。扩展您的解决方案的一种方法是实现这一点,即更新此值,如下所示:

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; }
    }
}
于 2015-04-16T11:19:39.540 回答
0

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

尝试这个;

if (IsNewRecord && Company != null && PreferredContactMethod == null)
    PreferredContactMethod = Company.PreferredContactMethod;
于 2015-06-11T14:41:49.343 回答