-1

コード内の私のコメントを参照してください。具体的なアクションタイプを取得するにはどうすればよいですか。また、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を持つドキュメントを含めることができます。

4

2 に答える 2

0

MyConstsのActionTypeプロパティは列挙型ですが、DocumentのActionTypeプロパティはTAction型です。TActionは参照型のように見え、列挙型は値型のように見えます。参照型を別の型から継承する場合にのみ、その型にキャストできます。値型を参照型にキャストすることはできません。最善の策は、DocumentクラスにgetActionType()メソッドを追加し、TActionが何であれ処理して、対応する列挙型を返すことです。その前に、列挙をDocumentクラスで使用できるようにする必要があります(おそらく、MyConstsクラスの外部で列挙を定義しますか?)。

于 2012-08-29T18:49:48.157 に答える
0

あなたがしていることは少し大雑把に見えますが、

MyConsts.ActionType bla = (MyConsts.ActionType)Enum.
    ToObject(typeof(MyConsts.ActionType), System.Convert.ToInt32(document.ActionType));

型の安全性を犠牲にして、あなたが求めていることを達成します。

于 2012-08-29T19:20:30.963 に答える