Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不使用new、Activator或已编译lambda的情况下创建对象_C#_Oop - Fatal编程技术网

C# 在不使用new、Activator或已编译lambda的情况下创建对象

C# 在不使用new、Activator或已编译lambda的情况下创建对象,c#,oop,C#,Oop,我目前正在尝试创建一个方法,该方法将接受X个实现特定接口的对象。然而,为了可读性,我不想使用new关键字来创建对象 例如,我的代码如下所示: var builder = new MyBuilder(); builder.Build(Value("Andre", "Like", "Test"), Value("Bob", "and", "Andre")); 这就是我要找的。我尽量避免做以下事情: var builder = new MyBuilder(); build

我目前正在尝试创建一个方法,该方法将接受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"));
我意识到在这个例子中,似乎没有任何理由去做我想做的事情,但回顾这个例子,有没有任何方法可以让我做我想做的事情?也许使用创建结构和使用操作符重载

本例中的值可以是类或结构,只要它们实现构建方法接受的某个接口


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

您可以使用一个名为Value的静态方法来为您执行新操作:

public static T Value<T>() where T : IInterface, new()
{
    return new T();
}
上面没有名称空间,所以任何类都可以使用它。示例如下:

var test = typeof(Test).Value();

要使用该API,您需要有一个
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");

让Create函数成为包含类的成员(或它的一个基)也许?@PMF我希望在很多地方使用MyBuilder。这仍然是一个选项吗?第一个示例看起来像是调用一个方法。所以,为什么不听听PMF写了什么,不要创建一个方法,然后它可以调用
Builder
,创建
new
,等等。将可重复的代码移动到类的私有方法中是非常有用的。@dreza:不,不太容易。如果在不同的类中需要它,您总是需要一个
new
或至少一个带有类限定符的静态方法。@PMF好的,谢谢,这是我想的,但您永远不知道。好的,但这要求静态方法要么在我执行此操作的每个类中,要么使用静态方法,如MyClass.Value(). 我可以在不必使用类前缀的情况下执行此操作吗?@dreza扩展对您有帮助吗?我不太清楚您为什么认为编写新关键字如此麻烦?@dreza您可以使用我编写的第一个T值方法,将其作为Builder类上的方法,然后在Builder类中创建新对象后,将其添加到该构建方法中。
var builder = new MyBuilder();
builder.BuildValue("Andre", "Like", "Test")
       .Value("Bob", "and", "Andre");