Есть ли прикрепленное свойство в самом C #? - PullRequest
13 голосов
/ 24 июня 2011

В самом C # есть ли что-то вроде "присоединенного свойства", используемого в WPF?

Ответы [ 5 ]

18 голосов
/ 24 июня 2011

Короткий ответ - нет. Немного более длинный ответ заключается в том, что это немного неудачная история. Мы разработали «свойства расширения» для C # 4 и дошли до реализации (но не тестирования) их, когда поняли, о, подождите, то, что мы разработали, на самом деле не совместимо со свойствами в стиле WPF. Вместо того, чтобы перепроектировать и переопределить функцию, мы в конечном итоге сократили ее.

Еще более длинная версия здесь:

http://blogs.msdn.com/b/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx

2 голосов
/ 24 июня 2011

AttachedProperties являются частью .NET Framework, не являются частью спецификации языка C # и, в частности, частью пространства имен System.Activities.Presentation.Model, которое является специфичным для WPF.

2 голосов
/ 24 июня 2011

В WPF вложенное свойство позволяет вам сделать что-то вроде:

<TextBlock Grid.Row="2" Text="I know nothing about grids!" />

Это было бы похоже на класс в C #, определяемый как:

public class TextBlock
{
    public string Text { get; set; }
}

И в состоянии сделать это:

var tb = new TextBlock();
tb.Grid.Row = 2; // this line would not compile

Чтобы сделать это, вам нужно передать объект Grid в ваш класс TextBlock:

public class TextBlock
{
    public string Text { get; set; }
    public Grid Grid { get; set; }

    public TextBlock(Grid grid)
    {
        Grid = grid;
    }
}

Но я не думаю, что есть что-то прямо эквивалентное тому, как присоединенные свойства работают в WPF. Вам нужно будет построить его вручную.

Чего вы пытаетесь достичь?

1 голос
/ 27 июня 2011

Вы можете использовать класс ConditionalWeakTable<TKey, TValue> для присоединения произвольного состояния к экземпляру. Вы можете комбинировать его с методами расширения, чтобы создать форму свойств расширения , но, к сожалению, без использования синтаксиса nice свойства в C #.

0 голосов
/ 24 июня 2011

Я думаю, вы думаете о геттерах и сеттерах.

Они созданы так:

public class Person
{
    //default constructor 
    public Person()
        {
        }

    private string _Name;
    public string Name
    {
        //set the person name
        set { this._Name = value; }
        //get the person name 
        get { return this._Name; }
    }
}

Подробнее о том, как они работают здесь: http://msdn.microsoft.com/en-us/library/aa287786(v=vs.71).aspx

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