我目前正在尝试创建一个接受X个实现特定接口的对象的方法。但是为了便于阅读,我不想使用new关键字来创建对象。
例如,我的代码如下:
var builder = new MyBuilder();
builder.Build(Value("Andre", "Like", "Test"),
Value("Bob", "and", "Andre"));
这就是我要找的东西。我试图避免这样做:
var builder = new MyBuilder();
builder.Build(new Value("Andre", "Like", "Test"),
new Value("Bob", "and", "Andre"));
甚至
var builder = new MyBuilder();
builder.Build(Value.Create("Andre", "Like", "Test"),
Value.Create("Bob", "and", "Andre"));
我意识到在这个例子中,似乎没有任何理由去做我想要的事情,但是看看过去的例子有什么方法可以做我想做的事情?也许使用创建结构并使用运算符重载?
在这种情况下,值可以是类或结构,只要它们实现Build方法接受的某个接口。
如果这太模糊,我可以尝试给出更好的描述。
答案 0 :(得分:1)
要获得该API,您需要使用Value
方法返回new Value()
。
如果您想在多个地方使用它,也许您可以将API更改为:
var builder = new MyBuilder();
builder.Build().Value("Andre", "Like", "Test")
.Value("Bob", "and", "Andre");
这并没有多大意义,但你可以拥有像
这样的东西var builder = new MyBuilder();
builder.BuildValue("Andre", "Like", "Test")
.Value("Bob", "and", "Andre");
答案 1 :(得分:0)
你可以有一个名为Value的静态方法为你做新的事情:
public static T Value<T>() where T : IInterface, new()
{
return new T();
}
如果你的T需要动态构造函数参数,你可以使用反射来调用构造函数。
该方法甚至可以是get属性。
编辑:要回答下面的评论,我知道你说过没有激活,但这是我能想到的:
public static class TypeExtensions
{
public static IInterface Value(this Type type)
{
return Activator.CreateInstance(type) as IInterface;
}
}
上面没有命名空间,所以任何类都可以使用它。示例如下:
var test = typeof(Test).Value();