Ваш первоначальный вопрос был ошибочным в том, что вы просили рассматривать переменную как тип, который не известен во время компиляции, но учтите, что у вас есть строка, определенная слева, когда вы объявляете вашу переменную. C # с 3.5 статически типизирован.
Как только будет доступна динамика, вы можете сделать что-то вроде этого:
dynamic foo = GetFoo();
foo.FunctionThatExistsInBarType();
Если вы не знаете, что это за тип, но знаете, что он всегда будет поддерживать метод экземпляра FunctionThatExistsInBarType ();
на данный момент вы вынуждены использовать рефлексию (или код поколения, который на самом деле означает почти то же самое, но дороже, а потом быстрее).
// any of these can be determined at runtime
Type t = typeof(Bar);
string methodToCall = "FunctionThatExistsInBarType";
Type[] argumentTypes = new Type[0];
object[] arguments = new object[0];
object foo;
// invoke the method -
// example ignores overloading and exception handling for brevity
// assumption: return type is void or you don't care about it
t.GetMethod(methodToCall, BindingFalgs.Public | BindingFlags.Instance)
.Invoke(foo, arguments);