Свободный API WPF для унаследованных свойств - PullRequest
0 голосов
/ 24 января 2012

Иногда у меня будет какой-нибудь код WPF C #, который я хотел бы написать «бегло».

Например, я мог бы захотеть настроить Window, содержащий ScrollViewer:

new Window()
    .SetContent(
        new ScrollViewer()
            .SetContent(
                ...))

Для достижения такого рода API я использовал такие методы расширения, как эти:

static class FluentScrollViewer
{
    public static ScrollViewer SetContent(this ScrollViewer obj, object val)
    { obj.Content = val; return obj; }
}

static class FluentWindow
{
    public static Window SetContent(this Window obj, object val)
    { obj.Content = val; return obj; }
}

Теперь Window и ScrollViewer оба наследуют свойство Content от ContentControl. Тем не менее, мне пришлось определить SetContent методы расширения для каждого класса отдельно.

Если я попытаюсь сделать что-то вроде этого:

static class FluentContentControl
{
    public static ContentControl SetContent(this ContentControl obj, object val)
    { obj.Content = val; return obj; }
}

и затем используйте его так:

new Window().SetContent(...)

метод SetContent, конечно, не возвращает Window.

Есть ли способ определить SetContent сверх ContentControl и заставить его делать "правильные вещи", чтобы избежать определения множества индивидуально специализированных методов, которые похожи, кроме типа?

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Вы можете использовать дженерики:

public static TControl SetContent<TControl>(this TControl obj, object val)
where TControl : ContentControl
{ 
    obj.Content = val; 
    return obj; 
}
1 голос
/ 24 января 2012

Я не думаю, что при создании новых элементов управления это дает большой выигрыш, поскольку вы также можете использовать инициализаторы :

new Window() {
    Content = new ScrollViewer() { Content = ... }
};
...