簡體   English   中英

泛型的C#反射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM