[英]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.