我有一个非常复杂的对象设置,每个选择都限制或扩展了可用的选项。我不想抛出异常或创建对象的无效实例。 因此,我想在基于先前方法输入参数构建实例时限制选项(可调用的方法)。例如,如果我有一些规则说明用户是否为“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中的所有其他公共方法选项,除了基于对象状态的有效选项。
答案 0 :(得分:2)
是的,这在理论上是可行的。 (虽然不太可能涉及匿名方法/类型。)
然而,使用将是一个噩梦。不幸的是,如果你将这些类型的限制放在使用流畅的界面中,你几乎需要知道规则来理解如何“构建”这种类型。
我更希望为不同类型的用户制作专门的用户子类。让每个子类的构造函数都需要正确初始化它们所需的参数,并根据需要公开方法和属性。
这样,您只需创建适当的用户:
UserA userA = new UserA(rolesList); // This requires roles to construct
UserB userB = new UserB(locationList); // This requires locations to construct
答案 1 :(得分: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;
}
}