Подтвердить что ты не робот

Есть ли прикрепленное свойство в С#?

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

4b9b3361

Ответ 1

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

Более длинная версия находится здесь:

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

Ответ 2

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

Ответ 3

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

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

Это будет похоже на наличие класса в С#, определенного как:

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. Вам нужно будет создать его вручную.

Что вы пытаетесь выполнить?

Ответ 4

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

Ответ 5

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

Они создаются следующим образом:

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