如何返回在编译时未知的类型
本文关键字:编译 未知 类型 何返回 返回 | 更新日期: 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>()
{
}