從我所知道的,通用參數永遠不會傳遞到TryGetMember()
或TryInvokeMember
覆蓋。 MSDN文檔僅顯示GetMemberBinder
和GetInvokeBinder
對象傳入的簡單字符串名稱。
最簡單的實現是在DynamicJSON
類上實際實現GetValues<T>()
。
public List<T> GetValues<T>()
{
Console.WriteLine("Called with generic parameter {0}", typeof(T));
return new List<T>();
}
當我跑了這個簡單的測試,泛型參數是一個.NET Int32
類型:
dynamic json = new DynamicJSON();
json.GetValues<int>()
如果實施GetValues<T>()
方法不適合你可行的,可以實現TryInvokeMember()
返回的方法已實施TryConvert()
。當.NET試圖將GetValues<int>()
的結果轉換爲List<int>()
時,將使用List<int>()
作爲「轉換綁定器類型」調用覆蓋的TryConvert()
方法。
public class DynamicJSON : DynamicObject
{
public override bool TryInvokeMember(InvokeMemberBinder binder, Object[] args, out Object result)
{
if (binder.Name == "GetValues")
{
result = new DynamicValues();
return true;
}
else
{
result = null;
return false;
}
}
private class DynamicValues : DynamicObject
{
public override bool TryConvert(ConvertBinder binder, out Object result)
{
Console.WriteLine("Converting dynamic values to {0}", binder.Type);
if (binder.Type == typeof(List<int>))
{
result = new List<int>();
return true;
}
else
{
result = null;
return false;
}
}
}
}
public class Test
{
public static void Main(string[] args)
{
dynamic json = new DynamicJSON();
List<int> values = json.GetValues();
Console.WriteLine(values.GetType());
}
}
我會假設答案(低於類型參數)在'binder'中是有效的。 – leppie 2010-11-10 08:13:59
差不多一年之後,但是你找到了解決這個問題的辦法嗎? – 2011-08-21 22:30:31
Nah。最後我只好與列表