При вызове базового конструктора RealProxy вы передаете тип целевого объекта, который должен быть проксирован. То, что я хотел бы сделать, - это динамически добавлять интерфейсы к прокси-типу, чтобы полученный прокси-тип мог быть добавлен к дополнительным интерфейсам.Как динамически объединить два интерфейса для перехода к RealProxy
Например:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;
namespace ConsoleApplication17
{
class Program
{
static void Main(string[] args)
{
MyProxy<IFoo> proxy = new MyProxy<IFoo>(new Foo());
IFoo proxiedFoo = (IFoo)proxy.GetTransparentProxy();
// make a proxied call...
proxiedFoo.DoSomething();
// cast proxiedFoo to IDisposable and dispose of it...
IDisposable disposableFoo = proxiedFoo as IDisposable;
// disposableFoo is null at this point.
disposableFoo.Dispose();
}
}
}
public interface IFoo
{
void DoSomething();
}
public class Foo : IFoo, IDisposable
{
#region IFoo Members
public void DoSomething()
{
//
}
#endregion
#region IDisposable Members
public void Dispose()
{
// dispose
}
#endregion
}
public class MyProxy<T> : RealProxy where T : class
{
private T _target;
public MyProxy(T target) :
base(CombineType(typeof(T), typeof(IDisposable)))
{
this._target = target;
}
private static Type CombineType(Type type1, Type type2)
{
// How to implement this method, Reflection.Emit????
throw new NotImplementedException();
}
public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg)
{
return InvokeRemoteCall((IMethodCallMessage)msg, this._target);
}
/// <summary>
/// Invokes the remote call.
/// </summary>
/// <param name="methodCall">The method call.</param>
/// <param name="target">The target.</param>
/// <returns>A <see cref="ReturnMessage"/></returns>
private static IMessage InvokeRemoteCall(IMethodCallMessage methodCall, object target)
{
MethodInfo method = methodCall.MethodBase as MethodInfo;
object callResult = (target != null) ? method.Invoke(target, methodCall.InArgs) : null;
LogicalCallContext context = methodCall.LogicalCallContext;
var query = method.GetParameters().Where(param => ((ParameterInfo)param).IsOut);
ParameterInfo[] outParameters = query.ToArray();
return new ReturnMessage(callResult, outParameters, outParameters.Count(), context, methodCall);
}
}
}
Так что для того, чтобы иметь возможность литых проксируемым типа к IDisposable
, мне нужно, чтобы иметь возможность отправить IDisposable
в дополнении к IFoo
для вызова RealProxy
базового конструктора.
В сущности, как реализовать этот метод для динамического добавления IDisposable
в IFoo
для проксирования.
private static Type CombineType(Type type1, Type type2)
{
// How to implement this method, Reflection.Emit????
throw new NotImplementedException();
}
Я думаю, что вы не можете реализовать свой 'CombineType()' в пути это будет иметь смысл здесь. – svick
@svick - Думаю, я мог бы использовать отражение Emit для создания нового динамического типа в памяти, который объединяет два целевых интерфейса, и они должны быть интерфейсами. – Jim