繁体   English   中英

如何在隐藏基类属性时使用抽象类和接口?

[英]How to use abstract class and Interface in hiding base class properties?

我已经创建了一个基本类“ Common”,其中有许多属性,例如pageno,pagesize,search等,将在整个项目的所有类中使用(必须)。 还有其他类作为“区域”,扩展了“普通”类。 所有属性都是自动获取和设置的。

这里的问题是,我创建了Web api。它返回Area类的对象。 因此,这里客户获得了area和common的所有属性。但是我需要特定的属性来进行响应。 表示我只需要Area It的两个属性AreaId,AreaName

对JSON和XML等不同格式的数据进行重新调整的要求。我使用linq进行了调整,它提供了我确切需要的特定属性。 但这是匿名类型的数据。 不强烈反对。 以下代码示例

    public class Common
    {
    public int CaseNo { get; set; }
    public int? RET_ID { get; set; }
    public string MSGSTATUS { get; set; }
    public string MSG { get; set; }
    public int? LoginId { get; set; }
    }


   public class Area : Common
    {
    public int AreaId { get; set; }        
    public string AreaName { get; set; }
    public string PinCode{ get; set; }
    }

/ Web api代码 /

         public IHttpActionResult GetAreaById(int AreaId, int LoginId)
         {
        try
        {
            AreaDAL objDal = new AreaDAL();
            Area objBo = new Area();
            objBo = objDal.EditArea(AreaId, LoginId);

            if (objBo != null)
            {
           /*Not working for xml returned data(work for json).anonymous type data*/
             return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, new Area { AreaId = objBo.AreaId, AreaName = objBo.AreaName }));

            /*working for json and xml */
            /*But it retuned all properties of Area and common*/
             /*Needed as AreaId and AreaName*/
             return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, objBo));

           }
         }

引入一个中间类(AreaInfo)并向上拉AreaId和AreaName成员:

    public class AreaInfo : Common
    {
      public int AreaId { get; set; }        
      public string AreaName { get; set; }
    }
    public class Area : AreaInfo
    {
      public string PinCode{ get; set; }
    }

// ...

      public IHttpActionResult GetAreaById(int AreaId, int LoginId)
      {
        try
        {
            AreaDAL objDal = new AreaDAL();
            Area objBo = new Area();
            objBo = objDal.EditArea(AreaId, LoginId);

            if (objBo != null)
            {
               return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, new AreaInfo { AreaId = objBo.AreaId, AreaName = objBo.AreaName }));

               return ResponseMessage(Request.CreateResponse(HttpStatusCode.OK, objBo));    
           }
       }

编辑:为了隐藏Common基类中的字段,您可以:

1)更改其访问修饰符(例如更改为受保护的)

2)用在序列化时跳过的属性标记它们,例如:

[XmlIgnore]用于xml序列化

[JsonIgnore]用于json序列化

3)分离类层次结构(AreaInfo <-Area中的Common),并在您需要Common类中的其他字段时使用组合。 例如

public class Common<T>
  where T: class
{
  //... common fields here
  public T Data {get;}
  public Common(T data) => Data = data;
}
...
var area = new Common(new Area(){...});
//area.LoginId;
//area.Data.AreaId;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM