So the way it works in with the DLR is that you give the invocation a context Type
so it can determine what methods are accessible. By default impromptu uses the type of the object you are invoking on so it typically works with most private methods, but obviously not of base classes.
In your case you need to create your own context for impromptu, which is mentioned in the documentation UsagePrivate, it works for the late binding types just as well as the interfaces. Also not clear from the documentation, but is the case, is that you can pass in a typeof() object for the context. So in your example you can do:
var context = InvokeContext.CreateContext;
Console.WriteLine(Impromptu.InvokeMember(context(type, typeof(OtherType)), "Method", 2));
If you have to do this for generic cases, it's not pretty, but you can always catch the exception and recursively try the base type, for the general case of it working on the first time there shouldn't be a slow down, and class hierarchies generally aren't very deep and since you are just doing this interactively once rather than thousands of times it should be okay.
var context = InvokeContext.CreateContext;
var type = target.GetType()
while(true){
try{
Console.WriteLine(Impromptu.InvokeMember(context(target, type), "Method", 2));
break;
}catch(RuntimeBinderException ex){
type = type.BaseType;
if(type ==null)
throw ex;
}
}