返回 IEnumerable 的 Linfu 动态代理和接口方法

本文关键字:代理 动态 接口 方法 Linfu IEnumerable object 返回 | 更新日期: 2023-09-27 18:36:06

我正在使用Linfu为接口生成代理对象。一切正常,除了调用返回IEnumerable<object>的方法时,我收到如下错误:

无法将类型为"d__2"的对象转换为类型"System.Collections.Generic.IEnumerable'1[System.String]"。

仅供参考:IEnumerableRpcCall是拦截器代码中执行yield return object而不是return object的方法的名称。

似乎问题在于 linfu 返回的是指向该方法的指针而不是IEnumerable。有没有人找到解决方法?

返回 IEnumerable<object> 的 Linfu 动态代理和接口方法

这个问题似乎与从IEnumerable< object >投射到IEnumerable< string >(或任何类型)有关。我通过将枚举器逻辑包装在实现IEnumerable<T>的自定义类中解决了它:

  public class MyEnumerator<T> : IEnumerable<T>, IEnumerable
  {
        // custom logic here
  }

然后在我的拦截器代码中,我使用反射来实例化 InvocationInfo 对象中指定的正确泛型类型:

  private class MyLinfuInterceptor : IInterceptor
  {
      public object Intercept(InvocationInfo info)
      {
            MethodInfo methodBeingRequested = info.TargetMethod;
            // enumerable return type
            if (methodBeingRequested.ReturnType.IsGenericType
               && methodBeingRequested.ReturnType.GetGenericTypeDefinition() == typeof(IEnumerable<>)
               && methodBeingRequested.ReturnType.GetGenericArguments().Length == 1)
            {
               Type constructedEnumerator = typeof(MyEnumerator<>).MakeGenericType(methodBeingRequested.ReturnType.GetGenericArguments());
               var result = Activator.CreateInstance(constructedEnumerator);
               return result;
            }
            // code to handle other return types here...
       }
   }

现在,当我进行返回IEnumerable<>的方法调用时,我的接口的代理对象不再抛出无效的强制转换异常

(更多关于编写林福动态代理拦截器的信息在这里)

相关文章: