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

时间:2019-02-12 08:26:25

标签: c#

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

这里的问题是, 我创建了Web api。它返回Area类的对象。 因此,这里客户获得了area和common的所有属性。但是我需要特定的属性来进行响应。 意味着我只需要Area i.t 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));

           }
         }

1 个答案:

答案 0 :(得分:0)

引入一个中间类(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类中的其他字段。 例如

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;