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 インターセプターの記述の詳細はこちら)