2017-07-10 9 views
1

私は非常に興味深い質問があり、まだ答えは見つかりませんでした。希望、誰かが私を助けることができます。署名は異なるが、お互いに由来する方法

まず私は、私はいくつかの方法でクラスを持って

interface IA {} 
class A : IA {} 
class B : A {} 

次のようなクラス階層を持って、派生クラス

class Test 
{ 
    public int Method(object dummy) { return 0; } 
    public int Method(IA dummy) { return 1; } 
    public int Method(A dummy) { return 2; } 
    public int Method(B dummy) { return 3; } 
} 

のパラメータを持つすべての名前が同じでdiffent署名は、コンパイラはdoesnの文句を言うと、それはすべての異なる署名を認識します。

new Test().Method(new Object()) returns 0 
new Test().Method(new A() as IA) returns 1 
new Test().Method(new A()) returns 2 
new Test().Method(new B()) returns 3 

a私が期待したいと思うように。

は今、私の質問に来ます。私は、リフレクション中に、4つの方法のどれが特定のパラメータータイプに最も適しているかを判断する必要があります。つまり、パラメータータイプがtypeof(A)であれば、 "ダミー"シグネチャーで3番目のメソッドを見つけなければなりません。 「A」は、「オブジェクト」のインスタンスであるため

「IsInstanceOfType」または「IsAssignableFrom」は、動作しません。タイプが正確に一致するかどうか最初に確認できますが、これはインタフェースを受け入れない場合にのみ問題を解決します。

誰にでも提案がありますか?

+0

これで何を達成しようとしていますか?オーバーロードは正確に同じで、実行時に適切な関数を呼び出します。ユースケースに言及して、問題をよりよく理解できるようにしてください。 – Harsh

+0

等価性チェックがインターフェイスに関する問題を解決しない理由を明確にしてください。 –

+0

'IA'でenumを使用して各クラスのコンストラクタでその値を設定することはできませんか?その後、列挙型の値をチェックして、手動で特定のメソッドを呼び出します。 –

答えて

0

あなたは、単にそれがあなたの指定された引数の型のために最も適した方法を見つけるだろう、Type.GetMethodを使用することができます。あなたはBとタイプCおよび過負荷のために過負荷がないので、あなたがTest.Method (B dummy)を取得します

typeof(Test).GetMethod("Method", new[] { typeof(C) }) 

を呼び出す場合

public class C : B 
{ 
} 

typeof(Test).GetMethod("Method", new[] { typeof(Object) }) // Object 
typeof(Test).GetMethod("Method", new[] { typeof(IA) }) // IA 
typeof(Test).GetMethod("Method", new[] { typeof(A) }) // A 
typeof(Test).GetMethod("Method", new[] { typeof(B) }) // B 
typeof(Test).GetMethod("Method", new[] { typeof(CultureInfo) }) // Object 
typeof(Test).GetMethod("Method", new[] { typeof(int) }) // Object 

あなたが同じTest class and a new class C`を持っていると仮定すると、型がもっとも適用可能な型です(タイプのオブジェクトを渡すと呼び出される型です)。

+0

答えをありがとう、しかし、上記の私のコメントを確認してください。取得するパラメータの種類が期待される方法と同じ順序でない可能性があるため、私はあなたの提案を使用することはできません。 しかし、私はミックスをすると思います。私があなたの方法で適切なメソッドを見つけたら、このメソッドを呼び出します。そうでなければ、型を並べ替えることを試みます。その場合、型は一致しなければなりません。 – Wernfried

関連する問題