gpt4 book ai didi

c# - 要求所有参数和所有参数命名的类构造函数

转载 作者:太空宇宙 更新时间:2023-11-03 19:00:27 27 4
gpt4 key购买 nike

有没有一种方法可以定义我的类,以便该类的调用者会收到编译时错误,除非他们指定了该类的每个属性,并附加了参数传递的命名限制?

假设我有这个界面:

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 对象,其初始化类似于第二个人,但要求所有属性被命名?

这是上面的 fiddle :https://dotnetfiddle.net/gUk8eT#

最佳答案

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

你要求能够强制执行两件事:

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

这些事情可以单独完成,但不能组合起来,因为这样做的方法是截然相反的,如下所述。

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

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

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

最接近的方法是将您的属性标记为只读(私有(private)集),并让它们只能在您的构造函数中设置,就像您在 PersonNeedAllProperties 类中所做的那样。

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com