2017-02-23 72 views
4

給定以下代碼爲什麼方法變量爲null?儘管方法肯定存在,但Type.GetMethod()返回null

Type[] typeArgs = { typeof(SomeClass) }; 
var listRef = typeof(List<>); 
var list = Activator.CreateInstance(listRef.MakeGenericType(typeArgs)); 
var method = list.GetType().GetMethod("Add‌​", BindingFlags.Default, null, typeArgs, null); 

我已經嘗試了許多不同的重載和的BindingFlags但還是從來沒有得到過的MethodInfo爲List<SomeClass>.Add(SomeClass item)

當然這是簡單的我很想念,但任何幫助將不勝感激。

+1

'BindingFlags.Default' - >'BindingFlags.Instance | BindingFlags.Public',' 「添加 」' - >'「 添加」'。 – PetSerAl

+0

我也嘗試過'BindingFlags.Instance | BindingFlags.Public',我不明白''添加' - >「添加」的含義' –

+0

嘗試''添加「.Length'。確保你複製粘貼你的「添加」,但不能輸入新的。 – PetSerAl

回答

6

字符串「Add」中有兩個不可見字符0x00 0x00,這是它無法工作的原因之一。你似乎做了一些複製/粘貼操作。

接下來,更改綁定標誌來BindingFlags.Public | BindingFlags.Instance

using System; 
using System.Collections.Generic; 
using System.Reflection; 

namespace GenericReflection 
{ 
    class Program 
    { 
     static void Main() 
     { 
      Type[] typeArgs = { typeof(SomeClass) }; 
      var listRef = typeof(List<>); 
      var list = Activator.CreateInstance(listRef.MakeGenericType(typeArgs)); 
      var method = list.GetType().GetMethod("Add", BindingFlags.Public | BindingFlags.Instance, null, typeArgs, null); 
      Console.WriteLine(method); 
      Console.ReadLine(); 
     } 
    } 

    internal class SomeClass 
    { 
    } 
} 
+0

好抓!你是怎麼看到這些無形的角色的?我非常驚訝,因爲我輸入了「Add」字符串,並且最初有正確的BindingFlags。當這不起作用時,我複製並粘貼了一些試圖使其工作的事情。 –

+4

@ShaneRay:賠率很好,這不是托馬斯韋勒的第一場牛仔競技。 :-)當你看到這幾次時,你會反省檢查是否有零寬度空格,字節順序標記,嵌入零字符,字母「A」是U + 0410(西里爾)而不是U +0041(拉丁)等等。 –

+2

好吧,我先複製/粘貼你的代碼。當它不工作時,我寫了一些代碼給了我所有的方法。很顯然,你有一個簽名的方法。這讓我看到了十六進制編輯器中的代碼。 –

相關問題