問題タブ [expandoobject]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - expando オブジェクトで計算されたプロパティを定義する
expando オブジェクトを使用しており、計算されたプロパティを定義しようとしています。
次のようなことを行うことで、単純なプロパティを定義できることを知っています。
同様に、メソッドを定義することもできます。
標準オブジェクトを操作する場合、計算プロパティを定義できます。つまり、カスタム メソッド/計算の結果を返すプロパティを定義できます。例は必要ありません。
expando で同様のことを行う必要があります。実際に「Func」を呼び出すプロパティ (または他の形式のデリゲート、カスタム メソッドを呼び出してカスタムの戻り値の型を取得できるとすぐにすべてが実行されます) が必要です。したがって、基本的には、2 番目の例のようにメソッドを呼び出す必要がありますが、プロパティのように機能させる必要があります。
基本的に、カスタム デリゲートをプロパティ本体として定義する機能を維持しながら、myExpando.GetTheQuestion()の代わりにmyExpando.GetTheQuestionで呼び出すことができる必要があります。
これを行う方法はありますか?式ツリーを使用すればこれができると思いますが、少し迷っていることは認めます。これを達成する方法について誰かがガイダンスを提供できますか??
編集
さらに調査を行いました..私が知らない非常に特定のクラス/インターフェース/シンタックスがない限り、上記は不可能だと思い始めています。私が得た情報によると、ExpandoObject クラスは、TryGetMember、TrySetMember などのバックグラウンド プラミングを行ういくつかのメソッドを定義することによって機能します。これで、動的 objetc で「プロパティにアクセス」するときに、TryGetMember が呼び出されるメンバーになります。そのメンバーは、一種の内部辞書から値を返します (はい、私は知っています...これは少し単純化されていますが、アイデアを与える必要があります)...返される値の型に関するテストはありません。これは、私の例では、myExpando.GetTheQuestionが元の Func を返すことを意味します。
TryGetMember は値を返すだけなので、プロパティ コードを "実行" する方法はないようです。それを達成するには、実際にはメソッドの結果である何らかの式/ラムダ/機能/アクション サロゲートが必要です。これは不可能に思えます(何かを見逃さない限り、あまり意味がありません-基本的に、「デリゲート」に設定された値があり、デリゲートの戻り値として取得されます???)。私は正しいですか、これですか、それとも何か不足していますか?
c# - C#でHttpRequestMessageのプロパティを再帰的にトラバースしてログに記録するにはどうすればよいですか?
見てくれてありがとう!
バックグラウンド
私はMVC4.NETアプリケーションに取り組んでおり、すべてのエラー(アプリケーション全体)をキャッチし、そのエラーをログに記録してから、HTML形式の電子メールで開発チームに報告するフィルターを作成しました。
私が書いたフィルターはHttpActionExecutedContextを取得し、そこから例外、スタックトレース、呼び出されたメソッド、およびその他の有用な情報を導き出すことができます。
アクセスする情報のほとんどは文字列またはIDictionaryの形式であり、ヘルパーメソッドを使用してこれらのアイテムを反復処理し、レポートの電子メール用のHTMLテーブルに配置します。
ただし、私に悲しみを与えているプロパティが1つあります。それは、HttpRequestMessageプロパティです。
HttpActionExecutedContextオブジェクト(HttpActionExecutedContext.Request.Properties)のこのプロパティには、さまざまなタイプのネストされたプロパティが多数あります。
問題
このHttpActionExecutedContext.Request.Propertiesオブジェクトを再帰的にトラバースし、KVペアの階層に解決するために、いくつかの障害に直面しています。問題は、null値、タイプの不一致などが原因です。
これが、Request.Propertiesから取得している現在の結果です。
MS_HttpContext:
System.Web.HttpContextWrapperMS_RetrieveClientCertificateDelegate:System.Func`2 [System.Net.Http.HttpRequestMessage、System.Security.Cryptography.X509Certificates.X509Certificate2]
MS_IsLocal:
値は作成されません。MS_IncludeErrorDetail:
値は作成されません。MS_HttpRouteData:System.Web.Http.WebHost.Routing.HostedHttpRouteDataMS_SynchronizationContext:
System.Web.AspNetSynchronizationContextMS_HttpConfiguration:System.Web.Http.HttpConfiguration
MS_DependencyScope:
System.Web.Http.Dependencies.EmptyResolverMS_DisposableRequestResources:> System.Collections.Generic.List`1 [System.IDisposable]
したがって、値に関して私が実際に取り戻しているのはtype
、プロパティの値だけであることがわかります。が必要value
です。その値がネストされた辞書などの場合は問題ありませんが、オブジェクトのタイプを指定するだけでは役に立たないため、値をトラバースしてKVペアをログに記録する必要があります。
質問
このオブジェクトを再帰的にトラバースして、KVペアのディクショナリを作成するにはどうすればよいですか(値の一部はディクショナリ自体です)。ヘルパークラスや、不足している動的メソッドのようなものはありますか?
code-analysis - ExpandoObjectはルール違反を引き起こしますCA1502:過度の複雑さを避けてください
メールマージタイプの操作を実行するコードがあり、dynamic/ExpandoObjectを使用してプロパティをアセンブルしています。メールのマージが発生する前に、途中でさまざまなメソッドがプロパティを追加するため、匿名クラスを構築する代わりにこれを行っています。コードは正常に実行されます。
問題は、Visual Studio Code Analysisが、ExpandoObjectの各プロパティセット操作を循環的複雑度の1ポイントとして評価することです。したがって、分岐ロジックのない一連のプロパティを設定する単純な線形メソッドは、このルールに違反する値である25を超えるスコアを取得します。
これは私のコードの問題ですか、それともコード分析の仕組みの問題ですか?
私のコードは次のようになります:
winforms - ExpandoObjectのインスタンスのカスタムプロパティの値を.NETWindowsフォームコントロールにバインドする
コンテキスト:Visual Studo 2012 / C#5.0
3つのテキストボックスコントロール(firstNameTextBox、lastNameTextBox、ageTextBox)と単純なカスタムクラスを備えた.NETWindowsフォームがあります。
そして、 CustomerカスタムクラスのインスタンスのプロパティをWindowsフォームコントロールにバインドしたいと思います。だから私は書く:
そしてそれはうまくいきます。次に、匿名タイプを使用してコードを少し変更します。
}
この場合、私は一方向のバインディングしか持っていませんが、それもかなりうまく機能します。次に、コードをさらに変更します。
ランタイムエラーが発生します:
'データソースのプロパティまたは列FirstNameにバインドできません。パラメータ名:dataMember '
質問:動的カスタムプロパティのセットを持つSystem.Dynamic.ExpandoObject(またはSystem.Dynamic.DynamicObject)のインスタンスを(テキストボックス)コントロールのWindowsフォームセットにバインドするにはどうすればよいですか?
注1:アグリゲーション/コンテナーヘルパークラスを使用したソリューションは、私にとっては問題ありません。
注2:数時間グーグルしてさまざまなテクニック(StackOverflowで見つけたテクニックを含む)を適用しようとしましたが、失敗しました。
HansPassantのヒントに基づく「エレガントな」ソリューションは次のとおりです。
c# - JSON.NETを使用してプロパティをExpandoObjectとして逆シリアル化します
たとえば、次のようなオブジェクトがあります。
そしてそれはこのように使用されます:
上記のインスタンスをシリアル化して取得したJSON文字列を逆シリアル化すると、Data
プロパティは、を指定しても、 :ExpandoObjectConverter
として逆シリアル化されません。ExpandoObject
匿名オブジェクトで割り当てられたクラスプロパティ、または少なくとも具体的なタイプではないクラスプロパティを逆シリアル化するにはどうすればよいExpandoObject
ですか?
編集:
誰かが私が動的オブジェクトを使うことができると答えました。これは私にはうまくいきません。私はこの方法で進むことができることを知っていますが、ExpandoObjectが必要なため、そうではありません。ありがとう。
編集2:
他のユーザーは、JSON文字列をに逆シリアル化できると答えましたExpandoObject
。これはこの質問の目的ではありません。動的プロパティを持つ具象型を逆シリアル化する必要があります。JSON文字列では、このプロパティは連想配列である可能性があります。
vb.net - vb.net と c# で ExpandoObject の動作が異なる
ここからいくつかのコードを変換した後https://github.com/facebook-csharp-sdk/facebook-winforms-sampleのような acseptig コードではありませんparameters.client_id
ここに私が問題を抱えているセクションがあります
c# - LINQを使用して、Selectステートメントから動的オブジェクトを出力することは可能ですか?もしそうなら、どのように?
現在LINQでは、以下がコンパイルされ、正常に動作します。
ただし、過去数バージョンの.NET / C#は、などの動的オブジェクトの役割を拡張しており、ExpandoObject
基本的にこれを行う方法があるかどうか疑問に思っています。
明らかに、私はすでに上記のコードを試しましたが成功しませんでしたが、何かが足りないようです。
.net - ExpandoObjectでメソッドをオーバーロードするにはどうすればよいですか?
私は次のexpandoオブジェクトを持っています
年齢を計算するメソッドを定義CalcAge
します..以下のようなパラメータを持つオーバーロードされたメソッドを追加したい
以下を実行できるようにするにはどうすればよいExpandoObject
ですか?