RealProxy 実装メモ

using System;
using System.Reflection;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Proxies;

/// <summary>
/// オブジェクトをラッピングするプロキシです。
/// </summary>
/// <typeparam name="T">ラッピングするオブジェクトの型。</typeparam>
public class WrappingProxy<T> : RealProxy
{
    /// <summary>
    /// ラッピングするオブジェクトを取得します。
    /// </summary>
    private readonly T _targetInstance;

    /// <summary>
    /// ラッピングするオブジェクトを取得します。
    /// </summary>
    public T TargetInstance
    {
        get
        {
            return this._targetInstance;
        }
    }

    /// <summary>
    /// WrappingProxy&lt;T> クラスの新しいインスタンスを初期化します。
    /// </summary>
    /// <param name="targetInstance">ラッピングするオブジェクト。</param>
    public WrappingProxy(T targetInstance)
        : base(typeof(T))
    {
        this._targetInstance = targetInstance;
    }

    /// <summary>
    /// 提供された System.Runtime.Remoting.Messaging.IMessage で指定されたメソッドを、
    /// ラッピングするオブジェクトで呼び出します。
    /// </summary>
    /// <param name="msg">メソッドの呼び出しに関する情報の System.Collections.IDictionary を格納している System.Runtime.Remoting.Messaging.IMessage。</param>
    /// <returns>呼び出されたメソッドが返すメッセージで、out パラメータまたは ref パラメータのどちらかと戻り値を格納しているメッセージ。</returns>
    public override IMessage Invoke(IMessage msg)
    {
        IMethodCallMessage methodCallMessage = (IMethodCallMessage)msg;
        MethodBase targetMethod = methodCallMessage.MethodBase;
        object[] args = methodCallMessage.Args;

        ReturnMessage returnMessage;
        try
        {
            object invokeResult = targetMethod.Invoke(this._targetInstance, args);
            returnMessage = new ReturnMessage(invokeResult, args, args.Length, methodCallMessage.LogicalCallContext, methodCallMessage);
        }
        catch (TargetInvocationException ex)
        {
            returnMessage = new ReturnMessage(ex.InnerException, methodCallMessage);
        }
        return returnMessage;
    }

    /// <summary>
    /// System.Runtime.Remoting.Proxies.RealProxy の現在のインスタンスの透過プロキシを返します。
    /// </summary>
    /// <returns>現在のプロキシ インスタンスの透過プロキシ。</returns>
    public new T GetTransparentProxy()
    {
        return (T)base.GetTransparentProxy();
    }
}