ある型を別のジェネリック型にキャストしようとしていますが、特定の状況でこれを行う方法についての解決策が見つかりません。単純化した状況は次のとおりです。これは非常に奇妙で人工的に見えるかもしれませんが、私の問題を指摘するだけです. 実際のアプリケーションはもっと理にかなっています... :-)
// Raw data coming from some source
public class RawDataType { }
// Abstract base class for structured data representing this raw data
public abstract class AbstractListDataType { }
// Generates lists of structured data
public class ListGenerator<TListDataType> where TListDataType : AbstractListDataType
{
public List<TListDataType> GenerateList()
{
// Get the data from some mysterious place
RawDataType data = new RawDataType() { ... }
// Cast it to the required structured data type
return new List<TListDataType>() { data as TListDataType ??? }
}
}
次に、実行時にロードされる別のアセンブリには、この生データの具体的な表現がいくつかあります。ListGenerator 自体には、これらの型に関する知識はまったくありません。構造化されたデータ型を含むアセンブリが読み込まれた後、リフレクションを使用して検査され、どのような種類の構造化されたデータを生成できるかが確認されます。
// Two types of structured application data that can be created from the raw data
public class ListDataTypeA : AbstractListDataType
{
public static explicit operator ListDataTypeA(RawDataType data) { ... }
}
public class ListDataTypeB : AbstractListDataType
{
public static explicit operator ListDataTypeB(RawDataType data) { ... }
}
もちろん、
data as TListDataType
意味がありません。RawDataType から ListDataTypeA への動的キャストを実現するにはどうすればよいですか?
編集:
次の作品のようです:
(TListDataType)(dynamic)data
これは非常に醜いと思います。ここで説明した状況を考えると、より良い方法はありますか?