2012-06-01 58 views
0

我正在使用Linfu爲接口生成代理對象。一切工作正常調用返回的IEnumerable<object>我得到一個錯誤,像這樣的方法時除外:Linfu動態代理和返回IEnumerable的接口方法<object>

無法轉換類型「< IEnumerableRpcCall> d__2」對象鍵入「System.Collections.Generic.IEnumerable`1 [System.String]」。

供參考:IEnumerableRpcCall是攔截器代碼,不會yield return object而非return object內的方法的名稱。

看來問題在於linfu正在返回一個指向方法的指針而不是IEnumerable。有沒有人找到解決方法?

回答

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