• 透明代理和泛型接口之间一个莫名其妙的问题


    在使用 .Net 4.0 运行时框架 RealProxy 类构造一个透明代理时,如果目标接口为泛型类型,或者继承一个泛型接口时,再通过 new Func 的方式调用泛型接口上的方法即会出现 System._Canon 类的问题。

    很奇怪的一个问题,找了一个多小时了,已经追到 Com 函数调用了,仍然没找到原因,初步诊断为 .Net 框架的一个 Bug 。

    代码如下:

    using System;
    using System.Runtime.Remoting.Messaging;
    using System.Runtime.Remoting.Proxies;
    
    namespace TestRealProxy
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                var service = new MyRealProxy().GetTransparentProxy() as IInterface;
    
                // 正确的结果
                var right = service.GetById(4);
    
                // 错误的结果
                Func<int, MyClass> func = service.GetById;
                var error = func(3);
            }
        }
    
        public interface IInterface<T> where T : class
        {
            T GetById(int id);
        }
    
        public interface IInterface : IInterface<MyClass>
        {
        }
    
        public class MyClass
        {
            public int Id { get; set; }
        }
    
        public class MyRealProxy : RealProxy
        {
            public MyRealProxy()
                : base(typeof(IInterface))
            {
            }
    
            public override IMessage Invoke(IMessage msg)
            {
                IMethodCallMessage methodCall = (IMethodCallMessage)msg;
    
                IMethodReturnMessage methodReturn = null;
                object[] copiedArgs = Array.CreateInstance(typeof(object), methodCall.Args.Length) as object[];
                methodCall.Args.CopyTo(copiedArgs, 0);
                try
                {
                    object returnValue = new MyClass { Id = (int)methodCall.Args[0] };
                    methodReturn = new ReturnMessage(returnValue, copiedArgs, copiedArgs.Length, methodCall.LogicalCallContext, methodCall);
                }
                catch (Exception ex)
                {
                    methodReturn = new ReturnMessage(ex, methodCall);
                }
    
                return methodReturn;
            }
        }
    }

    谁能解决这个问题?

  • 相关阅读:
    activiti串行会签的使用
    Linux中shell字符串分隔、字符串替换、字符串拼接
    spring 通过启动命令配置文件路径
    流程activiti的组和用户的使用
    使用activiti的designer插件记录
    windows下vue+webpack前端开发环境搭建及nginx部署
    node.js的安装
    开启我的博客之旅
    Docker 命令集合
    github免费搭建个人博客,拥有免费域名
  • 原文地址:https://www.cnblogs.com/lenic/p/3967108.html
Copyright © 2020-2023  润新知