Зачем использовать отражение, когда вы можете напрямую:
dynamic foo = External_COM_Api_Call();
string value = foo.FooBar;
Вот и весь смысл ключевого слова dynamic
. Вам больше не нужно отражение.
А если вы хотите использовать отражение, не используйте динамический:
object foo = External_COM_Api_Call();
string bar = (string)foo
.GetType()
.InvokeMember("FooBar", BindingFlags.GetProperty, null, foo, null);
Вот полный рабочий пример:
class Program
{
static void Main()
{
var type = Type.GetTypeFromProgID("WScript.Shell");
object instance = Activator.CreateInstance(type);
var result = (string)type
.InvokeMember("CurrentDirectory", BindingFlags.GetProperty, null, instance, null);
Console.WriteLine(result);
}
}