0

I am using Linfu to generate a proxy object for an interface. Everything works fine except when calling a method that returns an IEnumerable<object> I get an error something like this:

Unable to cast object of type '< IEnumerableRpcCall >d__2' to type 'System.Collections.Generic.IEnumerable`1[System.String]'.

FYI: IEnumerableRpcCall is the name of the method inside the interceptor code that does yield return object rather than return object.

It seems the problem is that linfu is returning a pointer to the method rather than an IEnumerable. Has anyone found a workaround for this?


try defining "function get" before you reference it.

$(document).ready(function() {
  function get() {
    $.post('data.php', {scu:testForm.scu.value}, function(output) {
      $('#output').text(output).show();
    });
  }
  $('#theButton').click(get);
  $('#scu').keyup(get);
});
4

1 に答える 1

0

IEnumerable< object >この問題は、 to 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<>

( LinFu Dynamic Proxy インターセプターの記述の詳細はこちら)

于 2012-06-04T11:40:01.250 に答える