問題タブ [fieldinfo]
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# - 別のクラスのフィールドでもあるクラスのフィールドの値を取得する
それでは、コードから始めて、自分自身をよりよく説明できるようにしましょう。int フィールドを含む MyClass クラスがあり、Foo クラスにも MyClass がフィールドとして含まれています。リフレクションを使用して MyClass から int フィールドの値を取得したい。
私が使うとき
問題は、f.myClass.Integer の値を取得する方法です。
前もって感謝します、
ポール
scala - scala-activerecord での Swagger の使用
次のようなアクティブなレコードがあります。
Swagger アノテーションを追加しました。
生成されたスキーマには、使用できない多くのジャンクが含まれています。
のソースコードを調べましたswagger-core
。ModelPropertyParser
以下を含むwith a メソッドがありparseRecursive
ます。
私が実行すると:
1 つのフィールドだけを宣言したので、正しいです。
私が実行すると:
ActiveRecord の内部フィールドはたくさんあります。このジャンクを取り除く方法はありますか?fieldInfo
Swagger の説明に次のフィールドを含めるだけです。
c# - 値からフィールドの FieldInfo を取得する方法
フィールドにある CustomAttributes などの目的で FieldInfo にアクセスしたいのですが、文字列を使用してそのフィールドにアクセスしたり、クラス内のすべてのフィールドを実行したりする必要はありません。
私が単に持っている場合、
「GetField」関数を介して直接「myInt」の FieldInfo にアクセスできることを知っています。その名前の文字列がある場合、または「GetFields」を循環する場合は、「myInt」という文字列を持つことに再び依存します。右のフィールドを確認してください。
ref myInt
、またはout myInt
、またはアクセスできるまだ知らないキーワードのような利用可能な魔法はありますか、またはそれを取得するために文字列名が必要に制限されていますか?
c# - クラス内の変数フィールドからの GetValue()
単純なクラスがあるとします:
ここで、このクラスのインスタンスのフィールドを反復処理し、このフィールドのフィールド (Field-Ception!) にアクセスして、適切なタイプの変数に値を割り当て、フィールドを効果的に「ラップ」して、連載。ここでは、Vector3 フィールド "myVector3" に到達し、そこに到達したら、そのフィールドを調べて、それらの値を 3 つのフロート (Vector3 を構成するもの) に割り当てます。
問題?フィールド情報。GetValue()
タイプを返しますMonoField
!fieldinfo を使用する場合。FieldType
、それは戻りますVector3
が、値が必要なので役に立ちません:/
c# - C# 手動で型を変換せずに FieldInfo.SetValue 関数を呼び出す方法
データクラスのインスタンスをデータベースに保存し、データベースからロードしたいと考えています。そして、SQLコマンドを自動的に生成したい。だから、それを解決するために Dictionary< string, string> を使う必要があると思います。
私の古い質問を参照してください: 2D 文字列配列を 2D [int, double, bool, ..] 配列に変換する方法は?
このような作業工程。
- data-class インスタンスをディクショナリ < string, string> に変換します。
- txt、データベースなどとの間で辞書を保存/ロードします。
- 辞書をデータクラスのインスタンスに変換する
とにかく問題を解決したと思います。しかし、2D 配列メソッドの変換はまだ完璧ではないと思います。FieldInfo.SetValue 関数を呼び出すときに、私のソリューションのようにスイッチ/ケース状態を使用せずに型変換を解決する別の方法があるのだろうか。
コードを簡素化するのに役立ちます。
このようなデータクラス
このようなメインコード
そして、これらのような SetFieldValue 関数
これはすべて私のコードの一部です。
c# - FieldInfo からコンテナ クラス インスタンスを取得する
ここで C# リフレクションを使用しています: プロパティの FieldInfo があり、それが属するクラスのインスタンスを取得したい (別のプロパティのコンテンツにアクセスできるようにするため):
たとえば、次のクラスを取り上げます。
私が持っているコードの一部で
これは可能ですか?
c# - 基本クラスの式ツリーを使用したフィールド ゲッター/セッター
この投稿の例とそのフォローアップの質問に従って、コンパイルされた式を使用してフィールドゲッター/セッターを作成しようとしています。
ゲッターはうまく機能しますが、任意のタイプのフィールドを割り当てるにはセッターが必要なので、セッターに行き詰まっています。
ここで私のセッターアクションビルダー:
ここで、一般的なセッターをキャッシュ リストに格納し (もちろん、毎回セッターを構築するとパフォーマンスが低下するため)、単純な "オブジェクト" としてキャストします。
今、私はこのようなフィールド値を設定しようとしています:
ジェネリックメソッドを呼び出して毎回キャストすることもできますが、パフォーマンスのオーバーヘッドが心配です...何か提案はありますか?
--編集済みの回答アンダーソン氏の回答に
基づいて、値の直接設定、キャッシュされたリフレクション (FieldInfo がキャッシュされる場所)、およびキャッシュされたマルチタイプ コードを比較する小さなテスト プログラムを作成しました。最大 3 レベルの継承 ( ObjectC : ObjectB : ObjectA
) でオブジェクト継承を使用します。
テストを 1 回繰り返すと、次の出力が得られます。
もちろん、これは単にオブジェクトを作成するコストを示しています。これにより、Reflection と Expressions のキャッシュされたバージョンを作成するオフセットを測定できます。
次に、1.000.000 回実行してみましょう。
完全を期すために、「set」メソッドの呼び出しを削除して、セッターを取得するコストを強調しました(FieldInfo
リフレクションメソッドのAction<object, object>
場合、式の場合)。結果は次のとおりです。
注: ここでの時間の増加は、(アクセス時間があるため) 大きな辞書ほどアクセス時間が遅くなるという事実によるものではなく、アクセス回数が増加O(1)
するという事実によるものです (1 回の反復につき 4 回ObjectA
、8 for ObjectB
, 12 for ObjectC
)... ご覧のとおり、作成オフセットのみがここで違いを生みます (これは予想されることです)。
結論: パフォーマンスは 2 倍以上向上しましたが、ダイレクト フィールド セットのパフォーマンスにはまだほど遠い状態です... リスト内の正しいセッターを取得できる確率は 10% です。
Reflection.Emit の代わりに式ツリーを試して、ギャップをさらに減らすことができるかどうかを確認します...コメントは大歓迎です。
EDIT 2この投稿でEli Arbelが 提案したように、一般的な「アクセサ」クラスを使用したアプローチを使用して結果を追加しました。