我正在使用Linfu为接口生成代理对象。一切正常,除非调用返回IEnumerable<object>
的方法时出现类似这样的错误:
无法转换类型为'&lt;的对象IEnumerableRpcCall&gt; d__2'键入'System.Collections.Generic.IEnumerable`1 [System.String]'。
仅供参考:IEnumerableRpcCall
是拦截器代码中执行yield return object
而不是return object
的方法的名称。
似乎问题是linfu返回指向方法的指针而不是IEnumerable
。有人找到了解决方法吗?
答案 0 :(得分: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<>