C# 在不使用new、Activator或已编译lambda的情况下创建对象
我目前正在尝试创建一个方法,该方法将接受X个实现特定接口的对象。然而,为了可读性,我不想使用new关键字来创建对象 例如,我的代码如下所示: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
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");