Оболочка C # для объектов

Я ищу способ создать общую оболочку для любого объекта.
Объект-оболочка будет вести себя так же, как и класс, который он обертывает, но сможет иметь больше свойств, переменных, методов и т. Д., Например, подсчет объектов, кеширование и т. д.

Скажем, класс-оболочка называется Wrapper, а класс, который нужно обернуть, называется Square и имеет конструктор Square (double edge_len) и свойства / methods EdgeLength и Area, я бы хотел использовать их следующим образом:

Wrapper<Square> mySquare = new Wrapper<Square>(2.5);  /* or */ new Square(2.5);
Console.Write("Edge {0} -> Area {1}", mySquare.EdgeLength, mySquare.Area);

Очевидно, я могу создать такой класс-оболочку для каждого класса, который хочу обернуть, но я ищу общее решение, т.е. Wrapper<T>, которое может обрабатывать как примитивные, так и составные типы (хотя в моей текущей ситуации я был бы счастлив просто обернуть мои собственные классы).

Предложения?

Спасибо.


person Haggai    schedule 28.05.2010    source источник
comment
Вы не можете этого сделать с C # до 3.0. Версия 4.0, однако, может позволить вам сделать это с помощью новой системы динамических типов.   -  person Marcelo Cantos    schedule 28.05.2010
comment
Не могли бы вы уточнить? Спасибо.   -  person Haggai    schedule 28.05.2010


Ответы (3)


Решением для вас может стать DynamicProxy из проекта Castle.

person Brian Gideon    schedule 28.05.2010
comment
+1, да - вопрос явно ищет реализацию прокси. DynamicProxy широко используется в мире .NET с открытым исходным кодом (его используют NMock2, NHibernate, Ninject и т. Д.). Единственное важное предостережение - вы не сможете использовать прокси для закрытых классов. - person Jeff Sternal; 28.05.2010
comment
Спасибо! Это действительно похоже на решение, которое я искал (хотя мне придется вникнуть в него подробнее). - person Haggai; 28.05.2010

Используйте шаблон декоратора или напишите ​​методы расширения.

person this. __curious_geek    schedule 28.05.2010
comment
Спасибо. Я думаю, что шаблоны декораторов не подходят, поскольку они требуют, чтобы я изменил всю мою программу, чтобы использовать их, и я хотел бы, чтобы оболочка была прозрачной для пользователя T. Что касается методов расширения - можете ли вы использовать аналогичный метод для добавления переменная к классу (т.е. к каждому объекту)? Или только методы? - person Haggai; 28.05.2010

Может быть, примерно так:

public class Wrapper<T>
{
    public readonly T Object;

    public Wrapper(T t)
    {
        Object = t;
    }
}

И тогда вы могли бы использовать его следующим образом:

Wrapper<Square> mySquare = new Wrapper<Square>(new Square(2.5));
Console.Write("Edge {0} -> Area {1}", mySquare.Object.EdgeLength, mySquare.Object.Area);
person Matthias    schedule 28.05.2010
comment
Спасибо, но этого я пытаюсь избежать. Я бы хотел, чтобы обертка была прозрачной для пользователя T. - person Haggai; 28.05.2010
comment
Этот ответ мне очень помог: D - person Krishan; 10.01.2017