如何强制客户端设置某些属性

时间:2014-11-21 15:14:58

标签: c#

我的类有十个属性,必须先设置才能使用该类。

我想强制(或者至少非常强烈地鼓励,最好是警告)我的类的用户在调用类的任何方法之前设置这些属性。

我可以使用一个构造函数,它将所有属性的值作为参数,但我不想这样,因为很多参数都很难用。

我可以检查类的所有方法中的属性值,但这太晚了 - 我想要编译时检查。

我该怎么办?

4 个答案:

答案 0 :(得分:6)

也许您可以使用流畅的界面使用Builder Pattern的某些变体。你可以有一些步骤或某些你不能跳过某些属性的东西。例如,要设置构建器的属性Y,您将需要由设置属性X的方法返回的对象。

new Builder().SetX(10).SetY(20) //compiles because SetX returns a class with SetY method
new Builder().SetY(20) //does not compile because the builder only has SetX method

为避免出现多个类,可能会有一个具有多个接口的类,每个接口只暴露一个方法。

另一方面,即使有很多参数,我也可能会选择构造函数

答案 1 :(得分:0)

一些想法:


可选参数应该减少构造函数参数的混乱

public class SomeClass
{
    public int Property1 {get; private set;}
    public int Property2 {get; private set;}
    public int Property3 {get; private set;}

    public SomeClass(int some1 = 1, int some2 = 2, int some3 = 3)
    {
        SomeProperty1 = some1;
        SomeProperty2 = some2;
        SomeProperty3 = some3;
    }
}

易于使用:

var a = new SomeClass(some3: 123);

如果未设置某个值,您可以尝试使用nullables throw

public class SomeClass
{
    private int? _property1;
    public int Property1 { get { return (int)_property1.Value; } } // will throw

    public SomeClass() {}

    public int SomeMethod()
    {
       int val = _property1.Value; // will throw
       ...
       return 123;
    }
}

答案 2 :(得分:0)

复杂构造函数的问题是它们通常无法解释预期的来源。例如,假设您有一个可以从字节数组,图像,句柄,内存地址,base64编码字符串或更多等创建的类。

要为每个人提供构造函数,你无法真正描绘它。例如。如果一个构造函数接受一个字符串(即使它的param名称是base64String),它也不是很直观。

我遵循复杂构造函数的一个更好的方法是使我的构造函数变为私有,而是通过公共静态方法公开我的对象的创建,返回它的实例自我。

例如,以.Net Graphics类为例。您可以从图像或Windows句柄等创建图形类,并且每个图形类都有“FromImage,FromHandle等”方法。在我看来,遵循该模式更直观,因为您知道您只是在方法名称中从图像创建它,这可以是一种驯服复杂构造函数和初始化模式的好方法。

答案 3 :(得分:0)

正如@Stilgar所说,Builder模式是一个很好的答案。取决于"鼓励"如果要给最终用户,可以使用带有默认参数的构造函数。这样他们就会看到他们应该设置的东西(使用Intellisense),但也可以选择他们希望用命名参数设置的东西。

        public ComplexObject(string P1 = "Test", int P2 = 123, double P3 = 3.1415927)
        {

        }

enter image description here