Вам нужно будет создать сайт для вызовов, создать связующее и т. Д.
Самый простой способ увидеть, что происходит, это скомпилировать:
public static object GetDynamicValue(dynamic o, string name)
{
return o.Foo;
}
Затем декомпилируйте его с помощью Reflector и выясните, что он делает. Заметьте, это будет довольно сложно, и вам нужно будет изменить его с одного статического сайта с кэшированным вызовом на создание нового при каждом вызове.
Вот пример, который работает ... но является ли это полностью правильным или нет, это другой вопрос :) (Я получил это, сделав именно то, что я предложил выше).
using Microsoft.CSharp.RuntimeBinder;
using System;
using System.Dynamic;
using System.Runtime.CompilerServices;
class Test
{
public static object GetDynamicValue(dynamic o, string name)
{
CallSite<Func<CallSite, object, object>> site
= CallSite<Func<CallSite, object, object>>.Create
(Binder.GetMember(CSharpBinderFlags.None, name,
typeof(Test), new CSharpArgumentInfo[]
{ CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) }));
return site.Target(site, o);
}
static void Main()
{
Console.WriteLine(GetDynamicValue("hello", "Length"));
}
}