1

更新 申し訳ありません。リフレクション ライブラリ全体が立ち入り禁止という意味ではありません。私はめちゃくちゃ遅い *.Invoke() ものを意味していました。

やあ、

通常のプロパティ アクセスの両方を許可するプロパティ システムを C# で実装する必要があります。

[property_attribute()]
return_type Property { get; set; }

文字列によるアクセス

SetProperty(string name, object value);
object GetProperty(string name);

でも、

  1. 各物件を個別に登録したくありません。
  2. リフレクションは使いたくない
  3. 辞書を介してプロパティにアクセスしたくない (つまり no PropertyTable["abc"]=val;)

このスキームは、プロパティをリモートおよびローカルで設定する必要があるクラスター コンピューティング スキームに必要です。すべてのプロパティには、初期化時に読み取られるカスタム属性があります。一定の実行時のパフォーマンスが得られることを願っています。

現在、私の考えは、カスタム パーサー/プリプロセッサが実行時にスクリプトを解析/コンパイルし、次のように set/get コードを生成することです。

object GetProperty(string name)
{
     if(name = "blah")
           return Property1;
     ...
}
...

ただし、このスキームではコードをデバッグできません。誰でも解決策を考えることができますか?

ありがとう

4

5 に答える 5

2

System.Reflection.Emit を使用して実行時に動的メソッドを生成することをお勧めします。優れたパフォーマンスが得られ、正常に動作するようになれば、デバッグは問題になりません。(あなたはそれが機能することに依存できるはずです、私には理由がわかりません)。

コンパイル時のコード生成や属性のマーキングなどに依存しないため、私は動的メソッドのアプローチを好みます。任意のオブジェクトで機能するように取得でき、そのオブジェクトのすべての公開された取得可能/設定可能なプロパティで機能します。

于 2009-08-19T03:06:56.153 に答える
1

PostSharpを試してこれらの属性を作成し、クラスにゲッター/セッター インターフェイスを実装させることができます。技術的にはリフレクションを使用しますが、コンパイル時にアセンブリを作成するため、典型的な System.Relfection の方法ではありません。

あなたの主な焦点がこれをリモートで行っている場合でも、ある種の Web サービスまたは WCF サービスをセットアップする必要があります。その場合、プロキシがあり、このプロキシは前述のフレームワークを使用して属性を設定できます。とにかく、Web サービスは本質的にリフレクションを使用するため、それを回避する方法はありません。

于 2009-08-19T03:07:06.543 に答える
1

を使用しない良い解決策を見つけるのは難しいと思いますDynamicMethod

LorenVSの回答にコメントしたように、 Expression TreesDynamicMethodを介して間接的に使用できます。

式ツリーを使用して単純なデリゲート ジェネレーターを実装しました。code.google.com にあるので、チェックアウトすることをお勧めします: LateBoundMethodFactory.cs。まだ適切なドキュメントがありませんが、そこにあるコードには十分なコメントが付けられています (私が通常行っているよりもはるかに多くのコメントがあります)。

更新:リンクが更新されました

于 2009-08-19T04:25:09.017 に答える
0

DynamicMethod を検索中にこれを見つけました。

http://msmvps.com/blogs/jon_skeet/archive/2008/08/09/making-reflection-fly-and-exploring-delegates.aspx

PropertyInfo から getter/setter デリゲートを作成し、ネイティブに近い get/set パフォーマンスを実現できることがわかりました。

于 2009-08-19T04:14:09.523 に答える
0

EAR プロパティを個別に登録したくない場合は、次の方法を使用できます。

protected void SetPropertyValue<V>(string プロパティ名, V 値) { ViewState[プロパティ名] = 値; }

protected V GetPropertyValue<V>(string propertyName, V nullValue) { //nullValue は string.Empty または true にすることができます || false または 0 など.... //ViewState[propertyName] が null の場合に返すデフォルト値.... if (ViewState[propertyName] == null) { return nullValue; } return (V)ViewState[プロパティ名]; }

于 2009-08-19T06:21:39.670 に答える