Как обернуть существующий экземпляр объекта в DispatchProxy?C#

Место общения программистов C#
Ответить
Anonymous
 Как обернуть существующий экземпляр объекта в DispatchProxy?

Сообщение Anonymous »

Я ищу замену RealProxy в .NET Core, и эта проблема перенаправляет меня в DispatchProxy.

У него простой API, но неясно, как обернуть существующий объект в прокси.

Например, имея этот интерфейс:

Код: Выделить всё

interface IFoo
{
string Bar(int boo);
}
и эта реализация:

Код: Выделить всё

class FooImpl : IFoo
{
public string Bar(int boo)
{
return $"Value {boo} was passed";
}
}
как получить то, что я хочу?

Код: Выделить всё

class Program
{
static void Main(string[] args)
{
var fooInstance = new FooImpl();
var proxy = DispatchProxy.Create();

var s = proxy.Bar(123);

Console.WriteLine(s);
}
}

class FooProxy : DispatchProxy
{
protected override object Invoke(MethodInfo targetMethod, object[] args)
{
return targetMethod.Invoke(/* I need fooInstance here */, args);
}
}
Поскольку потомки DispatchProxy должны иметь конструктор без параметров, единственная идея, которая у меня есть, — изобрести какой-нибудь метод, например этот:

Код: Выделить всё

class FooProxy : DispatchProxy
{
private object target;

public void SetTarget(object target)
{
this.target = target;
}

protected override object Invoke(MethodInfo targetMethod, object[] args)
{
return targetMethod.Invoke(target, args);
}
}
и используйте его следующим образом:

Код: Выделить всё

var fooInstance = new FooImpl();
var proxy = DispatchProxy.Create();

((FooProxy)proxy).SetTarget(fooInstance);

// the rest of code...
Это правильный подход?

Подробнее здесь: https://stackoverflow.com/questions/449 ... patchproxy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»