-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 回答