Вопрос

Мне нужно создать динамический прокси в C#. Я хочу, чтобы этот класс завершил другой класс, и взял на себя публичный интерфейс, пересылав вызовы этих функций:

class MyRootClass
{
    public virtual void Foo()
    {
        Console.Out.WriteLine("Foo!");
    }

}

interface ISecondaryInterface
{
    void Bar();
}

class Wrapper<T> : ISecondaryInterface where T: MyRootClass
{
    public Wrapper(T otherObj)
    {
    }

    public void Bar()
    {
        Console.Out.WriteLine("Bar!");
    }
}

Вот как я хочу его использовать:

Wrapper<MyRootClass> wrappedObj = new Wrapper<MyRootClass>(new MyRootClass());
wrappedObj.Bar();
wrappedObj.Foo();

производить:

Bar!
Foo!

Любые идеи?

Какой самый простой способ сделать это?

Как лучше всего это сделать?

Спасибо большое.

ОБНОВИТЬ

Я попытался следовать рекомендации Wernight и реализовать это с помощью динамических прокси C# 4.0. К сожалению, я все еще застрял. Точка прокси заключается в том, чтобы имитировать другой интерфейс, который (обычно обычно) ожидается. Использование DynamicObject требует, чтобы я изменил всех клиентов, чтобы использовать «Dynamic» вместо «IseCondaryInterface».

Есть ли способ получить прокси -объект, так что, когда он завершает A, он рекламирует (статически?), Что он поддерживает интерфейс A; И когда он завершает B, он рекламирует, что поддерживает интерфейс B?

Обновление 2

Например:

class MySecretProxy : DynamicObject, ISecondaryInterface
{
    public override void TryInvokeMember(...) { .. }

    // no declaration of Bar -- let it be handled by TryInvokeMember
 }
Это было полезно?

Решение

.NET 4 DynamicObject может помочь вам достичь этого.

Ранее .NET Framework может использовать:

  • Аспект#
  • Заказ aop
  • Spring.net
  • Аспект.net
  • Аспект
  • Динамический прокси
  • Составьте*
  • Loom.net
  • Postsharp

Каждая из этих структур использует числовые методы для инъекции кода как до, так и после выполнения метода. Обычно они делятся на 4 категории.

  • Инъекция MSIL - Здесь мы внедряем код MSIL в тело выполняемого метода. (Post Sharp)
  • Динамическая инъекция времени выполнения - Используя такие методы, как отражение, мы динамически вызываем методы.
  • Инъекция типа строителя - В связи с инъекцией времени выполнения, мы создаем тип, основанный на типе, который мы хотим прокси, а затем запрашивают маршал с помощью этого типа. (Динамический прокси)
  • Инъекция контейнера - Запросы проходят через контейнер, который вызывает код до и после выполнения нашего метода.

Увидеть Полная статья.

я знаю это Замок ПроектS. Динамический прокси часто используется (как в Могил Просто чтобы назвать один большой проект).


Ответить на обновленную тему

То, что вы написали, не будет компилироваться. Динамика Прокси - это код, сгенерированный во время выполнения, поэтому вам придется создать конкретный экземпляр класса, который вы оцениваете, так или иначе. Может быть, вы хотите сделать Аоп (Аспективное программирование).

class MySecretProxy<T> : DynamicObject, T where T : new()
{
    private T _instance = new T();

    public override void TryInvokeMember(...) { ... }
}

MySecretProxy<Bar> bar;

Другие советы

Вы смотрели на динамику проекта Castle? Это может обеспечить то, что вы в конечном итоге пытаетесь достичь. Видеть http://www.castleproject.org/dynamicproxy/index.html

Это также с открытым исходным кодом, так что вы можете даже расколоть его, если это необходимо.

Вы можете сделать это с помощью REALPROXY, если целевой тип является интерфейсом или вытекает из Marshalbyrefobject.

Вы можете посмотреть Линфу который содержит динамический прокси -механизм.

Я знаю прокси, которые используются Nhibernate для ленивой нагрузки

Замок

Линфу

Весенний байт -код

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top