あいまいな一致例外を回避する


115

コンパイル時にオブジェクトの型がわからないため、リフレクションを介して型に対して静的メソッドParseを呼び出しています(ただし、文字列をとるParseメソッドがあります)。

ただし、おそらく単一のオブジェクト(string、int、doubleなど)をとるオーバーロードされたParseメソッドがたくさんあるため、あいまいな一致例外が発生します。

正しいメソッド(Parse(string s))に到達し、例外がスローされないようにするために、メソッド呼び出しをより具体的にする方法を教えてください。

私のコードは次のようになります:

Type returnType = p.PropertyType;
object value = returnType.GetMethod("Parse").Invoke(null, new string[] { "1" });

回答:


193

使用この過負荷や使用を

returnType.GetMethod("Parse", new [] {typeof(string)})

9
@Bitterblue私はなぜあなたがそのコメントを書くのか、そしてなぜあなたは議論する価値のあるスタイルの問題を考えるのか混乱していますか?
Benjamin Podszun

9
プレゼンテーションは問題ありません。たまたま、あなたが好むように見えるスタイルとは異なるスタイルに従っているだけです。「もう少し青っぽいのなら、この自転車の小屋を使うだろう」という言葉に沿ってコメントしました。これは私を混乱させます。コメントの編集:あなたは新しい[] {}実際には配列の種類を推測していることを知らないでない限りISこの場合は新しいタイプ[]に相当?その場合、私は申し訳ありません-スニペットが間違っている可能性があると考えながら(両方とも動作します)、スタイルについてコメントしていると思いました(そうではありません)。
Benjamin Podszun 16

1
答えをありがとう、みんな。次の人の問題を保存するには、参照型について、次のようなものを使用します。typeof(string).MakeByRefType();
BRebey 2016

5
@Bitterblue私は「若い」わけではありません。読み取ることができないプログラマには、new [] { typeof(string) }コードの保守以外の問題があります。タイプは文字通りそこにあります。さらに、「クレイジーワンライナー」は関係ありません。あなたの好みのスタイルは、この行に余分な文字を追加するだけです。私は主張したいnew Type[] {...}、読みにくくているので、ラインの長い、それは無関係な情報/定型/ノイズです。したがって、これはスタイルの問題であり、パッシブなアグレッシブで議論を始めました。「私の好みに応えるのであれば、賛成票が投じられるでしょう。」
Benjamin Podszun

2
2つのメソッドが同じ名前、同じ数のパラメーター、同じタイプのパラメーターを持つ場合は機能しません。ここでは、明示的なキャスト演算子のオーバーロードについて考えています。たとえばpublic static explicit double(MyType obj)public static explicit float(MyType obj)。あなたはまだ持っていAmbiguousMatchExceptionます。この場合、returnType.GetMethods().SingleOrDefault(m => m.Name == "op_Explicit" && m.ReturnType == typeof(float))たとえば使用できます。
ギヨーム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.