2017-07-17 24 views
0

私は迷子になり、私が狂っているかもしれないと感じます。以下のコードでは、TestGetCountry()は正常に動作しますが、TestGetState()は "Parameter count mismatch"例外をスローします。なぜ私は1つの方法で例外を得ているのか、もう1つは他の方法ではなくなってしまったのです。デリゲートは同じシグネチャを使用し、同じ引数型(string [])を渡します。DynamicInvoke throwパラメータの数が一致しません

[TestMethod] 
    public void TestGetCountry() 
    { 
     string expected = Address.GetCountry(); 

     // get the method associated with this Enums.StringGenerator from the dictionary 
     Delegate action = StringGenerators.GetStringGenerator(Enums.StringGenerators.COUNTRY); 
     string[] args = new string[] { "" }; 
     string actual = (string)action.DynamicInvoke(args); 

     Assert.AreEqual(expected, actual, "Country does not match"); 
    } 

    [TestMethod] 
    public void TestGetState() 
    { 
     string expected = "CA"; 

     Delegate action = StringGenerators.GetStringGenerator(Enums.StringGenerators.STATE); 
     string[] args = new string[] {"CA", "NY"}; 
     string actual = (string)action.DynamicInvoke(args); // exception thrown here 

     Assert.AreEqual(expected, actual, "State does not match"); 
    } 

StringGeneratorデリゲートは、次のようになります。

public delegate string StringGenerator(object container); 

はgetCountryメソッドは次のようになります。

public static string GetCountry(object container) 
    { 
     return Address.GetCountry(); 
    } 

GETSTATE方法は、次のようになります。

public static string GetState(object container) 
    { 
     string[] states = (string[])container; 
     int index = SeedGovernor.GetRandomInt(states.Length); 
     return states[index]; 
    } 
+1

'GetCountry'-delegate?私が見るのは 'StringGenerators.GetStringGenerator'です。 – HimBromBeere

+0

@HimBromBeereこれらは動的に呼び出されるメソッドです。 –

+1

今後の参考として、ビットとピースではなく[mcve]を提供する価値があります。 –

答えて

8

string[]objectに変換可能であるので、この行:

string actual = (string) action.DynamicInvoke(args); 

...は、二つの引数を持つデリゲートを呼び出しています。それはその唯一の要素文字列配列への参照である単一要素object[]を作成するために展開されるように...

string actual = (string) action.DynamicInvoke((object) args); 

:あなたはこれをしたいです。

関連する問題