Более свободно C # / .NET - PullRequest
       60

Более свободно C # / .NET

15 голосов
/ 16 декабря 2009

Мой коллега придумал это, и мне интересно, что думают другие? Лично я нахожу это интересным, но задаюсь вопросом, если это слишком большой вылет? Примеры кода ниже. Методы расширения внизу.

Общие мысли, пожалуйста. Другие методы расширения, которые могут быть добавлены?

var ddl = Page.FindControl("LocationDropDownList") as DropDownList;

ddl.Visible = true;
ddl.SelectedValue = "123";

if(isAdmin)
    ddl  .SelectedValue = "111";

становится:

Page.FindControl("LocationDropDownList")
    .CastAs<DropDownList>()
    .With(d => d.Visible = true)
    .With(d => d.SelectedValue = "123")
    .WithIf(isAdmin, d => d.Items.Add(new ListItem("Admin", "1")));

Или:

 Page.FindControl("LocationDropDownList")
       .CastAs<DropDownList>()
       .With(d =>
       {
           d.Visible = true;
           d.SelectedValue = "123";
       })
       .WithIf(isAdmin, d => d.SelectedValue = "111");

Методы расширения:

public static TResult CastAs<TResult>(this object obj) where TResult : class
{
    return obj as TResult;
}

public static T With<T>(this T t, Action<T> action)
{
    if (action == null)
        throw new ArgumentNullException("action");

    action(t);

    return t;
}

public static T WithIf<T>(this T t, bool condition, Action<T> action)
{
    if (action == null)
        throw new ArgumentNullException("action");

    if (condition)
        action(t);

    return t;
}

Ответы [ 21 ]

0 голосов
/ 16 декабря 2009

Относительно "Свободного интерфейса" C # уже имеет отличный синтаксис для инициализаторов, который (ИМХО) лучше, чем попытка использовать свободный стиль. Конечно, в вашем примере вы не инициализируете новый объект, вы меняете существующий. Весь мой опыт работы с интерфейсами Fluent основан на 30-секундном сканировании wikipedia , но я думаю, что ответ JeeBee больше соответствует духу программирования на Fluent, хотя я могу немного изменить ситуацию:

Page.FindDropDownList("LocationDropDownList")    
  .setVisible(true)    
  .setAdminSelectedValue("111")
  .setSelectedValue("123")

Можно утверждать, что это более читабельно, особенно для языка без свойств, но я все еще думаю, что это не имеет смысла в C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...