我创建了一个基类为“ 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));
}
}
答案 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;