6

次のような動的オブジェクトがあります。

this.ChartDetails.Chart

「チャート」は動的です。Chart に LeftYAxis という名前の動的プロパティが存在するかどうかを確認したいと考えています。動的オブジェクトでこれを行う最良の方法は何ですか?

これは、ExpandoObject にプロパティが存在するかどうかを検出する方法の複製ではないと思いますか? 動的オブジェクトに対してこれを行うための最良の方法については説明していないためです。

4

4 に答える 4

6
bool isDefined = false;
object axis = null;
try
{
    axis = this.ChartDetails.Chart.LeftYAxis;
    isDefined = true;
}
catch(RuntimeBinderException)
{ }

これは、実行時に最初に発生することです。(プロパティにアクセスするとき、オブジェクトDynamicObjectTryGetMemberおよびTrySetMember

一部のオブジェクト ( などExpandoObject) は、実際にはボンネットの下の辞書であり、次のように直接確認できます。

bool isDefined = ((IDictionary<string, object>)this.ChartDetails.Chart)
    .ContainsKey("LeftYAxis");

基本的に:実際の型が何であるかを知らずにChartDetails.Chart(それが のExpandoObject単純な古いサブクラスobjectまたは のサブクラスである場合DynamicObject)、上記の try/catch 以外に方法はありません。コードを書いた場合ChartDetailsChartまたはソースコードにアクセスできる場合は、オブジェクトに存在するメソッドを特定し、それらを使用してチェックできます。

于 2012-06-05T15:08:09.150 に答える
1

これは、動的オブジェクトが 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;
    }
于 2016-10-24T04:41:12.277 に答える