【发布时间】:2013-01-09 04:16:11
【问题描述】:
Dart 编程语言支持method cascades。方法级联将允许以下 Silverlight/WPF C# 代码:
var listBox = new ListBox();
listBox.Width = 200;
listBox.MouseEnter += (s, e) => Console.WriteLine("MouseEnter");
var button1 = new Button() { Content = "abc" };
button1.Click += (s, e) => Console.WriteLine("button1.Click");
listBox.Items.Add(button1);
var button2 = new Button() { Content = "def" };
button2.Click += (s, e) => Console.WriteLine("button2.Click");
listBox.Items.Add(button2);
ContentPanel.Children.Add(listBox);
改为:
ContentPanel.Children.Add(
new ListBox()
..Width = 200
..MouseEnter += ((s, e) => Console.WriteLine("MouseEnter"))
..Items.Add(
new Button()
..Content = "abc";
..Click += ((s, e) => Console.WriteLine("button 1 Click")))
..Items.Add(
new Button()
..Content = "def";
..Click += (s, e) => (Console.WriteLine("button 2 Click"))));
我的问题是,有没有办法在 C# 中模拟或近似方法级联?
这是我想出的一种方法。鉴于此扩展方法:
public static T Call<T>(this T obj, Action<T> proc)
{
proc(obj);
return obj;
}
上面的例子可以写成:
ContentPanel.Children.Add(
new ListBox().Call(o => {
o.Width = 200;
o.MouseEnter += (s, e) => Console.WriteLine("MouseEnter");
o.Items.Add(
new Button().Call(b => {
b.Content = "abc";
b.Click += (s, e) => Console.WriteLine("button 1 Click"); }));
o.Items.Add(
new Button().Call(b => {
b.Content = "def";
b.Click += (s, e) => Console.WriteLine("button 2 Click"); })); }));
我不会说那很漂亮。 :-) 但它确实可以应用流畅的样式。
【问题讨论】:
-
你不是在找Object initializers吗?
-
@SimonWhitehead 对象初始化器仅适用于属性。该示例包括事件和方法调用。
-
我认为你所拥有的是尽可能接近。老实说,我不认为它比你的 Dart 例子丑得多。
-
@juharr 确实.. 傻我! :)
-
您可以随时切换到 VB.NET 并使用
With块...
标签: c# dart method-cascades