0

私は次のコードを持っています:

public class Processor
{
    private Query _query = 
        new SpecificQuery1();
    //OR
      //new SpecificQuery2();

   public void ProcessItem(dynamic dynamicResult)
   {
        //Can't use intellisense on dynamicResult

        var staticResult = dynamicResult as _query.GetSomeType();//Can't do it :(

        //Can use intellisense on staticResult
   }
}

そして、驚くべきことに、それはコンパイルされません。dynamic を var にキャストする方法はありますか? ばかげているように聞こえるかもしれませんが、この部分は何度も編集されるため、誰かが QueryImplementation を変更すると、ProcessItem() の型も変更する必要があります。ステップ数を 1 に減らしたい - SpecificQuery() を置き換えるだけで、型が自動的に変更されます。

では、言い換えさせてください。どのコンストラクターが基本クラス Query に割り当てられているかに基づいて、dynamicResult (またはそのキャストの一部) で Intellisense を使用する方法があるかどうかを知りたいです。

ありがとう

編集:申し訳ありませんが、おそらく間違って尋ねました。dynamic と var とは何かを理解しています。動的にインテリセンスを使用するつもりはありませんでした。dynamic を var に実際にキャストするつもりはありませんでした。

私が言いたかったのは、ダイナミックがどのタイプになるかについてコンパイル時の知識がある場合(それはクエリ実装に格納されます-静的にすることも、好きなものをconstにすることもできます)-この知識を使用できる方法はありますかProcessItem() でインテリセンスを有効にするには?

4

4 に答える 4

4

コンテキスト キーワードはvar単なる構文糖衣です。これで宣言された変数はすでに強く型付けされているため、何かを「キャスト」する必要はありません。

関数の結果の型が の場合dynamic、変数は で宣言されvarます。

staticResultタイプはdynamic:

var staticResult = dynamicResult;

型でインテリセンスを取得することはできませんdynamic取得するタイプがわかっている場合は、それにキャストします。これにより、インテリセンスにアクセスできます。

var staticResult = (myType)dynamicResult;

上記は、プロセスをクラッシュさせる実行時エラーと例外を簡単に引き起こす可能性があることに注意してください。

于 2012-11-19T12:10:23.287 に答える
2

と の違いを詳細に説明しているこの SO の回答を参照してください。質問に照らして、コンパイラはコンパイル時に型を認識し、実行時にのみ決定できることを知っておく必要があります。したがって、 (実行時に決定される) から(コンパイル時に決定される) にキャストされた型を割り当てることはできません。vardynamicvardynamic dynamicvar

では、なぜ動的にしないのでしょうか?

于 2012-11-19T12:10:37.670 に答える
2

いいえ、そのようなことはできません。

varそもそも、 は型ではないため、何かをキャストすることはできませんvar。さらに、キャストは静的に認識されている型に対してのみ行うことができます。これは、キャスト先の型をハードコードする必要があり、式を評価した結果 (例のメソッド呼び出しなど_query.GetSomeType()) にすることはできないことを意味します。

于 2012-11-19T12:11:08.103 に答える
1

次のようなものを実装できます

public abstract class AbstractQuery
{
     AbstractQuery Create(dynamic result);
}
public class SpecificQuery1 : AbstractQuery
{
    new public SpecificQuery1 Create(dynamic result)
    {
       ...
    }
}

public void ProcessItem(dynamic dynamicResult)
{
    var staticResult = _query.Create(dynamicResult);
}

動的から型付きの結果に変換する

于 2012-11-19T12:17:08.107 に答える