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

本文关键字:编译 未知 类型 何返回 返回 | 更新日期: 2023-09-27 17:59:38

以下是我迄今为止所拥有的:

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()

它是错误的,因为方法的返回类型只是一个对象,而不是在方法中构建的类型。

这样做的目的是建立一个生产"构建器"(遵循流畅的构建器模式)的工厂,并尝试创建一些语法糖,所以我不必这样做:

(new MyModelBuilder())
  .WithParameter(2)
  .WithAnother(3)
  .Build();

至少,I喜欢这个更好的外观(所以这是尚未实现的目标):

Builder.For<MyModel>()
  .WithParemeter(2)
  .WithAnother(3)
  .Build();

这可以在c#中完成吗?

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

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;

为构建器类型定义基类或接口:

public interface IBuilder 
{
    // common methods and properties here
}

让您的所有构建程序都继承自该接口或基类。

然后更新您的退货类型:

public static IBuilder For<T>()
{
}