次のコードを考えると、重複したアイテムを取得するのはなぜですか?
Type intType = typeof(Int32);
foreach(var v in intType.GetMethods())
Console.WriteLine(v.Name);
たとえば、ToString()
4 回表示されます。
次のコードを考えると、重複したアイテムを取得するのはなぜですか?
Type intType = typeof(Int32);
foreach(var v in intType.GetMethods())
Console.WriteLine(v.Name);
たとえば、ToString()
4 回表示されます。
Int32.ToString() には 4 つのオーバーロードがあるためです。intType.GetMethods()
これは、ブレークポイントを設定して結果を調べることで簡単に確認できます。
[5] {System.String ToString()}
[6] {System.String ToString(System.String)}
[7] {System.String ToString(System.IFormatProvider)}
[8] {System.String ToString(System.String, System.IFormatProvider)}
この型のすべてのオーバーロードメソッドをType.GetMethods()
返すためです。
Int32.ToString()
メソッドには 4 つのオーバーロードがあるため、...
System.String ToString()
System.String ToString(System.String)
System.String ToString(System.IFormatProvider)
System.String ToString(System.String, System.IFormatProvider)
その理由は、メソッドには名前だけでなく、次のようなものがあるからです。
Type intType = typeof(Int32);
foreach(var v in intType.GetMethods())
Console.WriteLine(v.Name + " " +
(v.IsStatic? "static " : "") +
string.Join(", ", v.GetParameters()
.Select(p => p.ParameterType.Name + " " + p.Name)));
印刷します
CompareTo Object value
CompareTo Int32 value
Equals Object obj
Equals Int32 obj
GetHashCode
ToString
ToString String format
ToString IFormatProvider provider
ToString String format, IFormatProvider provider
Parse static String s
Parse static String s, NumberStyles style
Parse static String s, IFormatProvider provider
Parse static String s, NumberStyles style, IFormatProvider provider
TryParse static String s, Int32& result
TryParse static String s, NumberStyles style, IFormatProvider provider, Int32& result
GetTypeCode
GetType
これは、Struct Int32 から String メソッドのすべてのオーバーロードを返すためです。
おそらく継承ツリー全体です。に渡しBindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly
てみてくださいGetMethods
。