首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回IEnumerable<object>的Linfu动态代理和接口方法

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

Stack Overflow用户
提问于 2012-06-01 16:21:02
回答 1查看 488关注 0票数 0

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

无法将“< IEnumerableRpcCall >d__2”类型的对象强制转换为类型为

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-04 11:40:01

这个问题似乎与从IEnumerable< object >转换到IEnumerable< string > (或其他类型)有关。我通过将枚举数逻辑封装到实现IEnumerable<T>的自定义类中来解决这个问题。

代码语言:javascript
复制
  public class MyEnumerator<T> : IEnumerable<T>, IEnumerable
  {
        // custom logic here
  }

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

代码语言:javascript
复制
  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<>的方法调用时,接口的代理对象不再抛出无效的强制转换异常。

(关于编写LinFu动态代理拦截器的更多信息)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10853969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档