有没有一种方法可以定义我的类,以便该类的调用者除非指定了该类的每个属性以及参数传递的其他约束,否则它们将获得编译时错误?

假设我有这个介面:

public interface IPerson
{
    string FirstName {get;}
    string MiddleName { get; }
    string LastName { get;}
}


这些类:

public class PersonNeedAllProperties : IPerson
{
    public string FirstName { get; private set;} // ideally readonly
    public string MiddleName { get; private set;}
    public string LastName { get; private set;}

    public PersonNeedAllProperties(
        string firstName,
        string lastName,
        string middleName)
    {
        this.FirstName = firstName;
        this.MiddleName = middleName;
        this.LastName = lastName;
    }
}

public class PersonCanNamePropertiesButNotSadlyNotRequired : IPerson
{
    public string FirstName { get; set;} // ideally readonly
    public string MiddleName { get; set;}
    public string LastName { get; set;}
}


然后这些恕我直言的问题如下:

var p1 = new PersonNeedAllProperties("lastName", "firstName", "middle");
 // woops wrong order because not named.

var p2 = new PersonCanNamePropertiesButNotSadlyNotRequired()
{
    FirstName = "firstName",
    LastName = "lastName"
}; // woops forgot all about the middlename.


有没有办法获得一个类似于第二个人的,带有初始化符号的简单POCO对象,但这需要命名所有属性?

这是上面的小提琴:https://dotnetfiddle.net/gUk8eT#

最佳答案

要回答您的问题,这是不可能的。

您要求能够强制执行以下两项操作:


a)强制设置所有属性
b)强制命名属性。


这些事情可以自己完成,但不能合并,因为这样做的方法截然相反,如下所述。

a)要强制设置所有属性,您需要将它们用作构造函数中的输入。

b)要强制按名称设置属性,则不能在构造函数中指定它们。

旁注:可以向构造函数提供命名参数,但不能强制使用这些参数,即var person = new Person(firstName: 'John', lastName: 'Doe', middleName: 'A')

最接近的方法是将属性标记为只读(私有集),并像在PersonNeedAllProperties类中所做的那样仅在构造函数中进行设置。

可能可行的替代方法称为Builder Pattern
这将有一个额外的类负责构造您的对象,但您仍将无法获得编译时错误,只能运行时。

关于c# - 需要所有参数并命名所有参数的类构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36804585/

10-11 22:30
查看更多