我正在使用Linfu为接口生成代理对象。一切正常,除了调用返回IEnumerable<object>
的方法时,我收到如下错误:
无法将类型为"
d__2"的对象转换为类型"System.Collections.Generic.IEnumerable'1[System.String]"。
仅供参考:IEnumerableRpcCall
是拦截器代码中执行yield return object
而不是return object
的方法的名称。
似乎问题在于 linfu 返回的是指向该方法的指针而不是IEnumerable
。有没有人找到解决方法?
这个问题似乎与从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<>
的方法调用时,我的接口的代理对象不再抛出无效的强制转换异常
(更多关于编写林福动态代理拦截器的信息在这里)