0

我有一个非常复杂的对象设置,并且沿途的每个选择都会限制或扩展可用的选项。我讨厌抛出异常或创建对象的无效实例。因此,我想在基于之前的方法输入参数构建实例时限制选项(可调用的方法)。例如,如果我有一些规则说如果用户属于“A”类型,则允许将其添加到角色中,否则如果它属于“B”类型,则询问位置并且位置是否在特定的邮政编码中......你得到这个想法

这是否可能与匿名方法,类型,无论什么

用户类型 A

UserBuilder builder = new UserBuilder
builer.Build().ForType("A").WithRoles(rolesList);

用户类型 B

UserBuilder builder = new UserBuilder
builer.Build().ForType("B").WithLocations(locationList);

更新:所以基本上我的问题是,有没有办法限制 api 中的所有其他公共方法选项,除了基于对象状态的有效选项。

4

2 回答 2

2

是的,这在理论上是可能的。(尽管很可能不会涉及匿名方法/类型。)

但是,使用将是一场噩梦。不幸的是,如果您将这些类型的限制放在使用流畅的界面中,您几乎需要了解规则才能了解如何“构建”类型。

我更愿意为不同类型的用户制作专门的用户子类。让每个子类的构造函数都需要正确初始化它们所需的参数,并根据需要公开方法和属性。

这样,您只需创建适当的用户:

UserA userA = new UserA(rolesList); // This requires roles to construct
UserB userB = new UserB(locationList); // This requires locations to construct
于 2009-10-28T17:16:44.450 回答
0

你可以做类似下面的代码,这显然只是一个概念。问题是您必须为链中的每种类型编写方法调用以维护流畅的接口。

class Program
{
    static void Main(string[] args)
    {
        var builder = new UserBuilder();
        builder.BuildTypeA().WithRoles("a,b");
        builder.BuildTypeB().WithLocations("c,d");
    }
}

public abstract class User {}
public class UserA : User {}
public class UserB : User {}

public class UserBuilder
{
    public UserABuilder BuildTypeA() { return new UserABuilder(); }
    public UserBBuilder BuildTypeB() { return new UserBBuilder(); }
}

public class UserABuilder
{
    public UserABuilder WithRoles(string roles)
    {
        // add roles
        return this;
    }
}

public class UserBBuilder
{
    public UserBBuilder WithLocations(string locations)
    {
        // add locations
        return this;
    }
}
于 2009-10-28T17:44:01.647 回答