这是我到目前为止所做的:
public static object For<T>()
{
var builderName = typeof(T).Name + "Builder";
var type = Type.GetType(builderName);
var builder = Activator.CreateInstance(type);
return builder;
}
这不是错误或任何事情,但问题是我打电话的时候:
var builder = Builder.For<MyModel>();
然后尝试在其上调用方法:
builder.WithAnything()
它出错,因为方法的返回类型只是一个对象,而不是在方法中构建的类型。
这样做的目的是让一个工厂生产&#34;建筑商&#34; (遵循流畅的建设者模式) - 并试图创造一些语法糖,所以我不必这样做:
(new MyModelBuilder())
.WithParameter(2)
.WithAnother(3)
.Build();
至少,我就像这样看起来更好(所以这是尚未实现的目标):
Builder.For<MyModel>()
.WithParemeter(2)
.WithAnother(3)
.Build();
可以在c#中完成吗?
答案 0 :(得分:2)
Servy已指出您已对已删除的答案发表评论,您说每个构建者可以使用不同的方法。
我不认为这种确切的方法会起作用,就像所有的建设者一样 会有不同的方法吗?
如果是这种情况,即单个构建器类型可以包含您要访问的方法,则Builder.For
方法抽象没有任何价值。
换句话说,如果没有For
可以返回的单一类型可能对您有用,除了您尝试构建的特定构建器类型之外,您可能还会新建构建器的一个实例,并用它完成。
另一方面,如果您对暴露统一API感兴趣,可以通过动态解析的构建器分析参数来构建对象,或者换句话说想要执行以下操作:
MyModel mm = Builder.For<MyModel>()
.WithProperty(x => x.MyModelProp)
.HavingValue(10)
.Build();
MyOtherModel mom = Builder.For<MyOtherModel>()
.WithProperty(x => x.MyOtherModelProp)
.HavingValue("hello")
.Build();
继续阅读。
我在这里猜测了一下,但我假设TBuilder应该与T有这种关系:
interface IBuilder<T>
{
T Build();
}
我们说你有:
class Tower
{
string Tallness { get { return "So tall"; } }
}
class TowerBuilder : IBuilder<Tower>
{
Tower Build() { return new Tower(); }
}
你可以像这样实现这个方法:
static IBuilder<T> BuilderFor<T>()
{
var builderName = typeof(T).Name + "Builder";
var type = Type.GetType(builderName);
var builder = (IBuilder<T>)Activator.CreateInstance(type);
return builder;
}
然后做:
var tb = BuilderFor<Tower>();
var towerTallness = tb.Build().Tallness;
答案 1 :(得分:0)
为构建器类型定义基类或接口:
public interface IBuilder
{
// common methods and properties here
}
让所有构建器继承自该接口或基类。
然后更新您的退货类型:
public static IBuilder For<T>()
{
}