2011-11-09 13 views
4

json.netでdynamicを使用すると、実行時バインディングの例外が発生し、キャストなしでメソッドを呼び出すのはなぜですか私は正しい型にキャストするとメソッドを呼び出すときにjson.netを動的に使用してRuntimeBinderExceptionを取得する理由

private static void Main() 
{ 
    dynamic json = JObject.Parse("{\"Test\":23}"); 
    var t = json.Test; 
    int a = t; //Success 
    Prop = t; //Success 
    Func(t); //RuntimeBinderException 
} 

private static void Func(int i){} 

private static int Prop { get; set; } 

はエラーがないが、私はそれを行う必要はありませんことを好むだろう。私は間違ったことをしていますか?これはjson.netライブラリの問題ですか、言語の制限です。

編集: これは、メソッドのシグネチャを制御できない問題を解決するためのもので、呼び出しごとにキャストしたくないという問題です。

+0

あなたは完全な例外メッセージを投稿してくださいことはできますか? –

答えて

3

これは、json.TestJValueを返し、JValueが動的TryConvertを返すためです。したがって、intを指すか、intにキャストして暗黙の静的変換を実行すると、実行時にTryConvertとなり、成功するでしょう。しかし、メソッドの引数にその動的に型付けされた変数を使用すると、C#ランタイムはFuncという名前のメソッドを 'JValue'に最もよくマッチする引数で検索します。可能なメソッドのすべての順列に対して 'TryConvert'これは唯一のものです)、実行時バインディングエラーが発生します。

したがって、最も簡単な解決策は、すべての呼び出しをキャストするか、またはJValueを引数として渡すたびに静的に型指定された変数を設定することです。

この同じ問題のより一般的な質問と回答は、あなたがより多くの情報を探しているなら、あまりにも実際にあります: Pass a dynamic variable in a static parameter of a method in C# 4

0

private static void Func(dynamic i){}

この問題を解決します。

+0

はい、私が呼び出しているメソッドのシグネチャを制御できないときはどうしますか? – Glitch

関連する問題