3

ある型を別のジェネリック型にキャストしようとしていますが、特定の状況でこれを行う方法についての解決策が見つかりません。単純化した状況は次のとおりです。これは非常に奇妙で人工的に見えるかもしれませんが、私の問題を指摘するだけです. 実際のアプリケーションはもっと理にかなっています... :-)

// 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

これは非常に醜いと思います。ここで説明した状況を考えると、より良い方法はありますか?

4

1 に答える 1