В самом С#, есть ли что-то вроде "прикрепленного свойства", используемого в WPF?
Есть ли прикрепленное свойство в С#?
Ответ 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