Динамический прокси-сервер 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 здесь)