Динамический прокси-сервер Linfu и методы интерфейса, возвращающие IEnumerable<объект>

Я использую Linfu для создания прокси-объекта для интерфейса. Все работает нормально, за исключением вызова метода, который возвращает IEnumerable<object> Я получаю ошибку примерно так:

Невозможно привести объект типа 'd__2' к типу 'System.Collections.Generic.IEnumerable`1 [System.String]'.

FYI: IEnumerableRpcCall это имя метода внутри кода перехватчика, который делает yield return object скорее, чем return object,

Кажется, проблема в том, что linfu возвращает указатель на метод, а не IEnumerable, Кто-нибудь нашел обходной путь для этого?

1 ответ

Решение

Проблема, похоже, связана с кастингом из 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<>

( подробнее о написании перехватчиков LinFu Dynamic Proxy здесь)

Другие вопросы по тегам