コード内の私のコメントを参照してください。具体的なアクションタイプを取得するにはどうすればよいですか。また、MyDtoへの直接キャストが機能しないのはなぜですか。
public class Gen1Layer<TData, TAction> : GenBaseLayer<TData, TAction>
{
public Gen1Layer(IGenBaseLayer<TData, TAction> layer) : base(layer) { }
public override Document<TData, TAction> ProcessDocument(Document<TData, TAction> document)
{
// Does not work!
// MyDto dto = (MyDto) document.Data;
// Does cast!
MyDto dto1 = document.Data as MyDto;
// Does not work!
MyConsts.ActionType bla = document.ActionType as MyConsts.ActionType;
// Does not work!
MyConsts.ActionType bla = (MyConsts.ActionType)document.ActionType;
}
}
Gen1Layerは次のように呼び出されます。
IGenBaseLayer<MyDto,MyConsts.ActionType> layer = new Gen1Layer<MyDto,MyConsts.ActionType>(null);
Document<MyDto,MyConsts.ActionType> doc = new Document<MyDto,MyConsts.ActionType>(new MyDto(),MyConsts.ActionType.Add,new Session());
doc = layer.ProcessDocument(doc);
public class Document<TData,TAction>
{
public Document(TData data, TAction actionType,Session session)
{
Data = data;
ActionType = actionType;
Session = session;
}
public TData Data { get; set; }
public TAction ActionType { get; set; }
public Session Session { get; set; }
}
public class MyConsts
{
public enum ActionType
{
Get,
Add,
}
}
public interface IGenBaseLayer<TData, TAction>
{
Document<TData,TAction> ProcessDocument(Document<TData,TAction> document);
}
public class GenBaseLayer<TData,TAction> : IGenBaseLayer<TData,TAction>
{
public GenBaseLayer(IGenBaseLayer<TData,TAction> layer)
{
NextLayer = layer;
}
public IGenBaseLayer<TData,TAction> NextLayer { get; set; }
public virtual Document<TData,TAction> ProcessDocument(Document<TData, TAction> document)
{
Console.Write("Gen’s");
return document;
}
}
私が達成しようとしているのは、汎用ベースレイヤーを作成することであり、派生レイヤーは、オーバーライドされたProcessDocumentメソッドの具象タイプです。これにより、IGenBaseLayerが派生レイヤーインスタンスのProcessDocumentメソッドを呼び出さないという多型が破られることを私は知っています。しかし、これは私が必要なものです。すべてのレイヤーには、CustomerDtoやSupplierDtoなどのさまざまなクローズドジェネリックタイプと、関連するCustomerActionTypeまたはSupplierActionTypeを持つドキュメントを含めることができます。