你必須建立一個呼叫的網站,創建一個粘結劑等
看看會發生什麼,最簡單的方法是編譯這樣的:用反射
public static object GetDynamicValue(dynamic o, string name)
{
return o.Foo;
}
然後反編譯,並制定出什麼它在做。它會非常複雜,介意你 - 你需要將它從一個單一的,靜態的,緩存的調用站點改變爲在每次調用時創建一個新站點。
下面是該做的工作的例子...但無論是完全正確與否是另一回事:)(我這做什麼我上面建議去。)
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"));
}
}
你能告訴更多一點關於你的使用情況?如果你想有一個類似於IDictionary的動態對象,爲什麼不使用ExpandoObject呢?喬恩的建議可能有效,但我有一種感覺,這對於你想要做的事情來說太複雜了。 – 2009-12-18 18:56:55