今回のテーマ
こんばんは、サルモリです!!
ココがポイント
今回のテーマはGetMethodメソッドを使用して、Containsメソッドが上手く取得できない場合の対処方法です。
今回は私もハマった忘備録でもあるので、短いです!
では、早速みていきましょう!!
GetMethodメソッドの使い方
GetMethodメソッドを使用すると、指定したメソッドを取得することが出来ます。
可変のラムダ式を作る時に役に立つんですよね。後日記事にしたいと思います。
下記はGetMethodでstring型のメソッド「ToLower」メソッドを取得した時の例です。
1 2 3 4 5 6 7 8 9 10 11 |
using System; using System.Reflection; class Program { static void Main(string[] args) { MethodInfo ToLower = typeof(string).GetMethod("ToLower", Type.EmptyTypes); Console.WriteLine(ToLower.Name); } } |
出力結果
ToLower
何も面白くないソースコード結果ですみません 😥
これを同じようにString型のContainsメソッドを取得してみます。
同じようにString型のContainsメソッドを取得してみる
Containsメソッドを取得してみましょう。何も考えずに同じように指定すると・・・
1 2 3 4 5 6 7 8 9 10 11 |
using System; using System.Reflection; class Program { static void Main(string[] args) { MethodInfo Contains = typeof(string).GetMethod("Contains",Type.EmptyTypes); Console.WriteLine(Contains.Name); } } |
出力結果 System.NullReferenceException
Nullとなりました。
この理由はToLowerメソッドは引数が無いのに対して、Containsはstring型を引数として指定しなければならないからです!
例としては下記のようなイメージですね!!
1 2 3 4 5 6 7 8 9 10 |
using System; class Program { static void Main(string[] args) { Console.WriteLine("AA".ToLower()); //←引数が0だからType.EmptyTypesで良い。 Console.WriteLine("AA".Contains("A"));//←引数の指定が必要。 } } |
因みに第2引数を指定しないと、下記のエラーが出てしまいます。
System.Reflection.AmbiguousMatchException
これは、Containsメソッドには、char型とstring型を引数として指定出来るので、どちらを取得すればいいのか分からないよ!ということです。
なので、引数がどの型なのか具体的に指定してあげましょう!指定方法は下記のソースコードです!
この指定方法が分かるまで本当に時間がかかった・・・。汗
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using System; using System.Reflection; class Program { static void Main(string[] args) { MethodInfo strContains = typeof(string).GetMethod("Contains", new Type[] { typeof(string) }); MethodInfo charContains = typeof(string).GetMethod("Contains", new Type[] { typeof(char) }); Console.WriteLine(strContains.Name); Console.WriteLine(charContains.Name); } } |
command
Contains
Contains
無事に指定できましたね^^
まとめ
今回の記事は色々調べても情報が全然なかったので、私の忘備録としても記事とさせて頂きました。
この記事の流れで可変のラムダ式についても触れていけたらなと思います!!
今回の記事がお役にたてたなら光栄です!!
是非、他の記事も役に立つと思うので、みてください!!!