不使用new或Activitor或编译的lambda创建对象

时间:2014-01-22 05:44:22

标签: c# oop

我目前正在尝试创建一个接受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方法接受的某个接口。

如果这太模糊,我可以尝试给出更好的描述。

2 个答案:

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