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

时间:2012-06-01 16:21:03

标签: c# interface ienumerable linfu-dynamicproxy

我正在使用Linfu为接口生成代理对象。一切正常,除非调用返回IEnumerable<object>的方法时出现类似这样的错误:

  

无法转换类型为'&lt;的对象IEnumerableRpcCall&gt; d__2'键入'System.Collections.Generic.IEnumerable`1 [System.String]'。

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

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

1 个答案:

答案 0 :(得分:0)

这个问题似乎与从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<>

的方法调用时,我的界面的代理对象不再抛出无效的强制转换异常

more on writing LinFu Dynamic Proxy interceptors here