0

私の目標は、遅延バインディングコード(つまり、CallSitesとBinders)を生成するようにコンパイラーに指示しながら、インテリセンスを使用できるようにすることです。

私が持っていると言う

class MyDynamicDataProvider
{
   public int Data{get;set}
}

私が書きたい:

MyDynamicDataProvider provider = new MyDynamicDataProvider();
int x = provider.Data;

Dataプロパティの呼び出しをレイトバウンドにしたい。しかし現在、変数を動的として宣言しない場合provider、コンパイラーは呼び出しを事前にバインドします。つまり、実行時に、プロパティのバッキングフィールドに格納されている値が返されます。

同時に、コーディング中にインテリセンスが必要です。つまり、適切なタイプを使用してプロバイダーを宣言する必要があります。

両端を同時に達成する方法はありますか(実行時に動的バインディングに依存しながら、インテリセンスの静的宣言を使用します)?

編集1:なぜゲッターを使って必要なロジックを実行しないのか不思議に思うかもしれません。問題は、私がいくつかのメタクラスを開発しようとしていることです。これにより、開発者は、動的な手段で魔法が起こっている間に、クラスとプロパティを定義し、ゲッター、セッター、メソッドなどを使用できます。そのようなタイプはたくさんあるので、クラス自体にそのような冗長なコードを避けたいと思います。

編集2:コンパイラーにそのメンバーへのすべての呼び出しをレイトバウンドするように指示する属性を持つクラスを宣言できれば素晴らしいでしょう。

4

4 に答える 4

2

Visual Studioは、メンバーが実際に「存在する」かどうかがわからないため、レイトバウンドオブジェクトにインテリセンスを提供できません。Visual Studioがこれをすぐに提供できる可能性がありますが、そうではありません。デフォルトのインテリセンスは、ダイナミックでシャットオフするだけです。2つの解決策があります:

  1. 電話をかけたいメンバーがわかっている場合、なぜ遅延バインディングを使用しようとしているのですか?
  2. Resharperのような一部の製品は、他の場所で行われたレイトバウンド呼び出しを静的に検索することにより、疑似インテリセンスを提供します。Hello下の画像では、他の場所でその呼び出しを行うコードがあるため、インテリセンスを提供します。それは賢いですが、それは絶対確実ではありません。

リシャーパー

于 2011-09-02T17:54:09.170 に答える
1

これを行うための最善のオプションは、おそらくファサードを使用して、動的に必要なことを実行するように実装することです。Data

どういうわけかMyDynamicDataProviderがあり、それがDynamicとして呼び出されたときに何をすべきかを知っていると仮定すると、次のような静的に型指定されたファサードを使用できます。

 class DataProviderFacade 
 { 
     private dynamic inner;
     public DataProviderFacade(dynamic inner)
     {
         this.inner = inner;
     }

     public int Data { get { return inner.Data; } }
 }

そうは言っても、なぜこれが必要になるのか想像できません。

于 2011-09-02T17:47:37.017 に答える
0

実際には必要ないようですdynamic。静的に定義されたプロパティとメソッドの機能を動的に実装したいだけです。その場合は、クラスを抽象として作成してから、動的に実装できます。

これを行うにはいくつかの方法があります。Reflection.EmitまたはCodeDOMを直接使用して、抽象クラスから継承するクラスを生成します。または、 Castle DynamicProxyのように、これをはるかに簡単にする(通常は多少遅くする)ツールを使用することもできます。

于 2011-09-02T19:01:51.540 に答える
0

オープンソースのImpromptuInterface(nuget経由)を使用すると、静的インターフェイスを定義でき、そのインターフェイスのメンバーに一致する動的バインディングコード(コールサイトとバインダー)を出力してキャッシュします。ActLikeと呼ばれるオブジェクトで単一のジェネリック拡張メソッドを使用するだけで、そのインターフェイスが静的に返され、実際にそのインターフェイスを実装し、c#動的バインディングを介して呼び出しを転送する発行されたプロキシが返されます(静的オブジェクトと動的オブジェクトなどで機能します) 。

プロキシを1回生成した後、メソッドを呼び出すためのパフォーマンスコストは、静的呼び出し1回と動的呼び出し1回だけです。

public interface IMyDynamicDataProvider
{
   int Data{get;set}
}

..。

IMyDynamicDataProviderprovider = new MyDynamicDataProvider().ActLike<IMyDynamicDataProvider>();
int x = provider.Data;
于 2011-09-07T15:05:38.360 に答える