[英]C# Reflection with generics
我已經搜索了一段時間,但沒有找到任何地方。 我要執行以下操作:
給定類型說Dictionary<string,MyClass>
並說它的方法ContainsKey(string)
-在運行時,我希望能夠提取出此方法的“通用簽名”。 那就是我想獲取Boolean Dictionary<TKey,TValue>.ContainsKey(TKey)
(而不是Boolean ContainsKey(string)
)
我知道這可以通過執行以下操作
var untyped_methods = typeof(DictObject).GetGenericTypeDefition().GetMethods();
// and extract the method info corresponding to ContainsKey
但是,是否可以直接從實際類型而不是通用類型反映的方法中獲取此信息? 含義我可以從如下獲得的方法中獲得通用定義:
var actual_typed_methods = typeof(DictObject).GetMethods()
從本質上講,可以直接從上面第二個代碼片段中返回的MethodInfo對象獲取“ 未類型化 ”的方法簽名(而不是通過比較列表並弄清楚)
謝謝
編輯:也許這做了你想要的。 不知道您是否真的想Invoke
。
如果是調用,則否(請參見下文)。 如果只需要定義,則可以使用typeof(Dictionary<,>)
獲得原始的泛型定義。
不幸的是,如果您想Invoke
,則不會。
演示原因:
void Main()
{
var genericDictionaryType = typeof(Dictionary<,>);
var method = genericDictionaryType.GetMethod("ContainsKey");
var dict = new Dictionary<string, string>();
dict.Add("foo", "bar");
Console.WriteLine("{0}", method.Invoke(dict, new[] { "foo" }));
}
產生以下錯誤:
無法對包含ContainsGenericParameters為true的類型或方法執行后期綁定操作。
聽起來很容易修復。 只需調用method.MakeGenericMethod(typeof(string));
獲取實際的類型化MethodInfo
對象。
再一次不幸的是,你不能。
布爾值ContainsKey(TKey)不是GenericMethodDefinition。 只能在MethodBase.IsGenericMethodDefinition為true的方法上調用MakeGenericMethod。
原因是因為定義為bool ContainsKey(TKey)
而不是bool ContainsKey<TKey>(TKey)
。
您需要從正確的Dictionary<TK,TV>
簽名中獲取ContainsKey
方法才能使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.