2017-02-23 5 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を試してみましたが、それでもList<SomeClass>.Add(SomeClass item)ためMETHODINFOを取得したことがありません。

確かに私は行方不明ですが、どんな助けもありがたいです。

+1

'BindingFlags.Default' - >' BindingFlags.Instance | BindingFlags.Public'を、 '' "追加 " - > ''" 追加します"。 – PetSerAl

+0

私は 'BindingFlags.Instance | BindingFlags.Public'を試してみました。あなたが' 'Add '' - >' 'Add" 'の意味を理解していません。 –

+0

' 'Add" .Length'を試してみてください。あなたが '' Add ''をコピーして貼り付けて、新しいものをタイプしないようにしてください。 – PetSerAl

答えて

6

「Add」という文字列には、2つの不可視文字「0x00 0x00」があります。これが機能しない理由の1つです。コピー/貼り付けの操作をしたようです。

次に、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の代わりにU + 0410(キリル文字)であるかどうかを調べることについては、 +0041(ラテン語)など。 –

+2

さて、あなたのコードを最初にコピー/ペーストしました。それが動作していないとき、私はすべての方法を私に与えたいくつかのコードを書いた。明らかに、あなたが書いた署名が付いたメソッドがありました。これで、16進エディタのコードを見ることができました。 –

関連する問題