私は答えが単純ではないことを知っています.そして、私はすでにいくつかの(私は醜いと思います)クラッジを使用しています. 私は単にいくつかのエレガントな答えを探しています。
抽象クラス:
public interface IOtherObjects;
public abstract class MyObjects<T> where T : IOtherObjects
{
...
public List<T> ToList()
{
...
}
}
子供:
public class MyObjectsA : MyObjects<OtherObjectA> //(where OtherObjectA implements IOtherObjects)
{
}
public class MyObjectsB : MyObjects<OtherObjectB> //(where OtherObjectB implements IOtherObjects)
{
}
この時点で T の型が具体的にわからないため、MyObjects (または他の同様のグループ化、ジェネリックまたはその他) のコレクションをループして、 MyObjects基本クラスのToListメソッドを利用することは可能ですか?
編集 具体的な例については、これが発生するたびに、しばらく考えて、代わりに別のことをしたので、現在の要件はありません。でもかなり頻繁に出てくるので、浮かせてみようと思いました。
EDIT @Sara、それは私が気にかけているコレクションの特定のタイプではなく、リストである可能性がありますが、それでも各インスタンスの ToList メソッドは匿名タイプなしでは比較的使用できません)
@aku、本当です。この質問は比較的仮説的なものかもしれませんが、T 個のオブジェクトのリストを取得して操作でき、それらの基本型のみを知っていれば非常に便利です。ToList が BaseType のリストを返すようにすることは、私の回避策の 1 つです。
編集@すべて:これまでのところ、これは私が望んでいた種類の議論でしたが、それは私が疑っていたことをほぼ確認しています. これまでありがとうございましたが、それ以外の方はお気軽に入力してください。
EDIT @Rob、はい、定義されたタイプに対して機能しますが、タイプが IOtherObjects のリストとしてのみ知られている場合は機能しません。
@ロブ再びありがとう。それは通常、私の不器用な回避策でした(無礼ではありません:))。それか、ConvertAll 関数を使用してデリゲートを介してダウンキャストします。問題を理解するために時間を割いていただきありがとうございます。
少し混乱した場合の修飾編集
より正確に言えば、(これの最新の実装を複雑にしすぎた可能性があります):
オブジェクト A から継承した B と C の 2 つのオブジェクト タイプがあるとします。
多くのシナリオが、B のリストまたは C のリスト、またはその他の場合はいずれかのリストから、どこにあるかを示してきましたが、基本クラスにいる場合、あまり具体的でないリストが必要かどうかはわかりません。 A.
上記の例は、List Of Less Specific問題の最新の化身の骨抜きにされた例です。
書く必要のあるコードの量を制限し、他のオプションよりも少し洗練されていると思われるシナリオを考えてみると、通常はそれ自体が提示されています。多かれ少なかれ得た可能性やその他の視点についての議論が本当に欲しかった. ConvertAll() は私が使用した別の回避策であるため、これまで誰も言及していないことに驚いていますが、手元のシナリオには少し冗長すぎます
@ロブ・イェット・アゲインとサラ
ありがとう、しかし、私はすべての静的コンテキストの栄光でジェネリックを理解していると感じており、ここで発生している問題を理解していました.
私たちのシステムの実際の設計とそのジェネリックスの使用法 (私は設計の当事者の 1 人に過ぎなかったので、これは偏見を含まずに言えます) はうまくいきました。それは、私がコア API を扱っているときです。単純に何かを行うのに間違った範囲にいる状況を見つけました。代わりに、好きなよりも少しエレガントではない方法でそれらに対処しなければなりませんでした (いずれかを賢くしようとしました)。またはおそらく怠け者-私はそれらのラベルのいずれかを受け入れます)。
私がクラッジと呼んだものに対する私の嫌悪感は、主に、オブジェクトをベース値に変換するためだけにレコード セットをループする必要があることです。これはパフォーマンス ヒットになる可能性があります。
他の誰かが以前にコーディングでこれに遭遇したかどうか、そして誰かが私よりも賢く、または少なくともエレガントに対処したかどうか疑問に思っていたと思います。