【问题标题】:How to use abstract class and Interface in hiding base class properties?如何使用抽象类和接口隐藏基类属性?
【发布时间】:2019-02-12 08:26:25
【问题描述】:

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

这里的问题是, 我已经创建了 web api。它返回了 Area 类的对象。 所以这里客户端收到了区域和常见的所有属性。但是我需要特定的属性来响应。 意味着我只需要 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));

           }
         }

【问题讨论】:

  • 所以您的问题是如何在不写new Area... 的情况下将对象提供给xml 响应,或者您具体要问什么? “不工作”到底是什么意思?
  • 你提到“匿名数据”,你的意思是像new { AreadId, AreaName }这样的东西吗?如果是这样,该解决方案有什么问题?
  • 是的,还需要类结构的推荐。如果我使用新的 {AreaId,AreaName} ,它没有在 web api 中重新调整为 xml

标签: c#


【解决方案1】:

引入一个中间类(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) 分离类层次结构(Common from AreaInfo

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;

【讨论】:

  • 您的答案不符合预期,因为当我重新调整 AreaInfo 对象时,它还包含 Common 类属性。我不想显示或分配 Common 类属性。
  • 用一些隐藏基类成员的选项编辑了答案,
猜你喜欢
  • 2011-01-09
  • 2012-10-22
  • 2013-12-31
  • 1970-01-01
  • 2019-01-09
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多