你必须建立一个呼叫站点,创建一个活页夹等。
查看结果的最简单方法是编译:
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"));
}
}