次のような動的オブジェクトがあります。
this.ChartDetails.Chart
「チャート」は動的です。Chart に LeftYAxis という名前の動的プロパティが存在するかどうかを確認したいと考えています。動的オブジェクトでこれを行う最良の方法は何ですか?
これは、ExpandoObject にプロパティが存在するかどうかを検出する方法の複製ではないと思いますか? 動的オブジェクトに対してこれを行うための最良の方法については説明していないためです。
次のような動的オブジェクトがあります。
this.ChartDetails.Chart
「チャート」は動的です。Chart に LeftYAxis という名前の動的プロパティが存在するかどうかを確認したいと考えています。動的オブジェクトでこれを行う最良の方法は何ですか?
これは、ExpandoObject にプロパティが存在するかどうかを検出する方法の複製ではないと思いますか? 動的オブジェクトに対してこれを行うための最良の方法については説明していないためです。
bool isDefined = false;
object axis = null;
try
{
axis = this.ChartDetails.Chart.LeftYAxis;
isDefined = true;
}
catch(RuntimeBinderException)
{ }
これは、実行時に最初に発生することです。(プロパティにアクセスするとき、オブジェクトDynamicObject
のTryGetMember
およびTrySetMember
一部のオブジェクト ( などExpandoObject
) は、実際にはボンネットの下の辞書であり、次のように直接確認できます。
bool isDefined = ((IDictionary<string, object>)this.ChartDetails.Chart)
.ContainsKey("LeftYAxis");
基本的に:実際の型が何であるかを知らずにChartDetails.Chart
(それが のExpandoObject
単純な古いサブクラスobject
または のサブクラスである場合DynamicObject
)、上記の try/catch 以外に方法はありません。コードを書いた場合ChartDetails
、Chart
またはソースコードにアクセスできる場合は、オブジェクトに存在するメソッドを特定し、それらを使用してチェックできます。
これは、動的オブジェクトが json/open-standard 形式の場合に機能します。
オープン標準フォーマット用と「標準オブジェクト」用の 2 つの異なるメソッド ヘルパーを作成しました。
// Checks if object typed json or xml has a specific property
public static bool IsPropertyExistsOpenStandardFormat(dynamic dynamicObject, string propertyName)
{
try
{
var x = dynamicObject[propertyName];
if (x != null)
return true;
}
catch
{
return false;
}
}
// Checks if standard object has a specific property
public static bool IsPropertyExistsStandard(dynamic dynamicObject, string propertyName)
{
return dynamicObject.GetType().GetProperty(propertyName) != null;
}