如何在编译时返回未知的类型?

时间:2015-06-24 20:47:04

标签: c#

这是我到目前为止所做的:

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#中完成吗?

2 个答案:

答案 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>()
{

}