【发布时间】:2012-04-27 08:54:13
【问题描述】:
这就是我想要实现的目标:
config.Name("Foo")
.Elements(() => {
Element.Name("element1").Height(23);
Element.Name("element2").Height(31);
})
.Foo(23);
或者像这样:
.Elements(e => {
e.Name("element1").Height(23);
e.Name("element2").Height(31);
})
.Foo(3232);
这是我目前拥有的:
public class Config
{
private string name;
private int foo;
private IList<Element> elements = new List<Element>();
public Config Name(string name)
{
this.name = name;
return this;
}
public Config Foo(int x)
{
this.foo = x;
}
... //add method for adding elements
class Element
{
public string Name { get; set; }
public int Height { get; set; }
}
}
有人知道怎么做吗?
【问题讨论】:
-
查克·诺里斯,人们会期望你回旋解决问题,它会自行解决。 :-)
-
您已经评论了除我之外的所有答案 - 对此有何感想?如果您真的热衷于手动执行此操作,我可能会提出更多想法 - 但我仍然认为使用对象/集合初始化器是一种更惯用的方法。
-
@JonSkeet 我想知道如何做我在问题顶部展示的内容,我知道这是可能的,你可以在这里看到它demos.telerik.com/aspnet-mvc/grid(查看标签)
-
@ChuckNorris:但是为什么您想避免使用惯用的 C# 方法吗?我会发现你提出的代码比集合/对象初始化方法更难理解。在这里引入 lambda 表达式有什么好处?仅仅因为别人的 API 使用了一个想法并不意味着它是一个好的想法......
-
@JonSkeet 一个好处是您可以使配置类通用
并且为 T 的每个属性强类型化元素
标签: c# .net fluent-interface