When implementing dynamic dispatch using dynamic
on a generic class, and the generic type parameter is a private inner class on another class, the runtime binder th
It's a bug. If you can make the call statically (and you can), you should be able to make it dynamically.
Specifically, the following code works:
using System;
public abstract class Dispatcher {
public T Call(object foo)
{
return CallDispatch(((object)(dynamic)foo).ToString());
}
protected abstract T CallDispatch(int foo);
protected abstract T CallDispatch(string foo);
}
public class Program {
public static void Main() {
TypeFinder d = new TypeFinder();
Console.WriteLine(d.Call(0));
Console.WriteLine(d.Call(""));
}
private class TypeFinder : Dispatcher {
protected override CallType CallDispatch(int foo) {
return CallType.Int;
}
protected override CallType CallDispatch(string foo) {
return CallType.String;
}
}
private enum CallType { Int, String }
}
Note that I've used ToString()
to make the static type known, the C# compiler and CLR allow this context to access the private type CallType
, so the DLR should allow it as well.