Добавление свойства в существующий класс

У меня есть частный класс, который я использую для реализации определенных свойств. Таким образом, у меня нет возможности изменить фактический частный класс и я не хочу использовать наследование для создания своего собственного класса вместо него. Есть ли способ добавить свойства в этот частный класс?

Спасибо!


person locoboy    schedule 28.09.2010    source источник


Ответы (2)


Если вы можете получить доступ к данным в нужном вам классе и можете использовать методы вместо свойств, загляните в методы расширения, представленные в C# 3.0. Из этой статьи вот метод расширения, добавленный в (запечатанный, немодифицируемый) класс String:

public static class MyExtensions
{
   public static int WordCount(this String str)
   {
       return str.Split(new char[] { ' ', '.', '?' }, 
                        StringSplitOptions.RemoveEmptyEntries).Length;
   }
}   

Из изо рта лошади расширенные свойства возможны в будущей версии C#.

Это не поможет вам, если вам нужно получить доступ к закрытым полям или методам. В этом случае вы можете заглянуть в отражение, но я бы посоветовал держаться подальше от этого, если это действительно необходимо — иногда это может привести к беспорядку.

person Michael Petrotta    schedule 28.09.2010
comment
строго говоря, C# 3.0 (не .NET 3.0), поскольку вы можете использовать методы расширения для любой версии .NET, если просто определите атрибут. - person Marc Gravell; 28.09.2010

Если целью свойств является привязка данных, вы можете добавить свойства времени выполнения к типам вне вашего контроля, используя TypeDescriptionProvider, который является фабрикой для ICustomTypeDescriptor. Затем вы свяжете исходного поставщика и создадите пользовательский PropertyDescriptor, который получит дополнительные данные.

Это достаточно просто для дополнительных свойств, доступных только для чтения, которые рассчитываются на основе существующих свойств (и под «достаточно простым» я подразумеваю «лишь немного безумное»), но для свойств чтения-записи (или свойств которые не зависят от существующих элементов), это очень сложно, так как вам нужно выяснить, куда поместить эти значения (таким образом, чтобы все равно собирался мусор и т. д.). Нетривиальный.

person Marc Gravell    schedule 28.09.2010