2

Class BaseFilter と BaseFilter クラスの派生クラスがいくつかあります。

1. List<base> list = getFilters();
2. foreach(Base filter in list){
3.     var filterType = filter.GetType();
4.     var filter1 = filter as filterType;
5.     //DO SOME DERIVED CLASS OPERATION
6. }

コード 3 行目でエラーが発生しています。課題は、フィルターが任意の派生クラス型である可能性があることです。フィルター オブジェクトを実際の派生クラスに型キャストする方法はありますか?

次のエラーが表示されます: タイプまたは名前空間名 'filterType' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

それを行う正しい方法は何ですか?

4

2 に答える 2

6

フィルター オブジェクトを実際の派生クラスに型キャストする方法はありますか?

いいえ。コンパイル時にキャストしようとしている型を知っている必要があります。

そのタイプがわからない場合、実行する操作をどのように知ることができますか? すべての型に対して同じ操作を実行する場合、その操作は基本クラスに (おそらく抽象形式で) 存在する必要があります。

基本的に、現時点ではあなたのリクエストは役に立ちませんが、実際に何をしようとしているのか、そして「実際の型へのキャスト」が適切であると考える理由について詳細を提供できれば、あなたをもっと助けることができます。

場合によっては、 を使用すると役立つことがわかるかもしれませんがdynamic、クリーンなアプローチが失敗した後の最後の手段としてのみ使用します。達成しようとしていることを知らずに、これらのクリーンなアプローチについてアドバイスすることはできません。 .

于 2012-11-23T07:23:13.880 に答える
2

Jon Skeetがすでに述べたように、タイプを知らずにタイプにキャストすることはできません。ただし、コンパイル時に知っている派生クラスの数が少ない場合は、次のようにすることができます。

List<base> list = getFilters();
foreach(Base filter in list)
{
   if(filter is DerivedFilter1)
   {
      var derived1 = filter as DerivedFilter1;  
      // do some DerivedFilter1 specific operations
   }
   else if(filter is DerivedFilter2)
   {
      var derived2 = filter as DerivedFilter2;  
      // do some DerivedFilter2 specific operations
   }
   else 
   {
      // do some general operations
   }
}
于 2012-11-23T07:39:51.523 に答える