そのコードは致命的に欠陥があります。
これ does そのプロパティを指定している限り、作業してください。
void Bar()
{
Foo(new {Position = 0});
}
void Foo(dynamic args)
{
Console.WriteLine(args.Position);
}
それは出力されます 0
, 、Aを投げません RuntimeBinderException
.
しかし、そのようなコードの目的は、呼び出し側が必要なプロパティだけを指定し、残りを省略する可能性です。
あなたはこの省略を介してチェックしようとしています if(args.Position != null)
. 。しかし、それはうまくいかない、それはすでに必要です Position
存在する。
パラメータの種類があることに気付くであろう匿名設定オブジェクトをサポートするASP.NETのルーティングAPIを参照している場合 object
そして違います dynamic
.
using object
それ以外の dynamic
APIをアセンブリ境界にわたって使用することができます。
それで、それはどのように機能しますか?
リンクされた答えのように、あなたは手動でプロパティの辞書を作成する必要があります。あなたが平野の古いものを使うかどうか Dictionary<string, object>
またはAN ExpandoObject
好みの問題です。
using ExpandoObject
あなたのコードを少し簡単に読み書きするのが簡単になりますが、必要ありません。
実際の例外についてあなたが取得しています:
見つけることができないことを伝えてください Position
財産 object
. 。それが欠けていた匿名型になる場合 Position
プロパティ例外メッセージは参照しません object
しかし匿名のタイプに。このようなもの:
'<>f__AnonymousType0'
'Position'の定義を含まない