返回另一个类中的 IList<GenericClass> 属性
Posted
技术标签:
【中文标题】返回另一个类中的 IList<GenericClass> 属性【英文标题】:Returning an IList<GenericClass> property in another class 【发布时间】:2021-03-17 12:50:06 【问题描述】:我有一个需要通用的ErrorMessage
类和ResultMessage
类。 ErrorMessage
是:
public class ErrorMessage
public int httpStatus get; set;
public string Header get; set; = "Error";
public string Message get; set;
ResultMessage
与ErrorMessage
相同,除了它还必须返回IList
结果,这意味着例如如果我成功插入用户,输出应该是
"httpStatus": 200,
"Header" : "Success",
"Message" : "User added Successfully",
"Result" :
"userName": "dfdaadf",
"password": "faeferafreaf"
我的ResultMessage
是:
public class ResultMessage : ErrorMessage
public ResultMessage()
httpStatus = 200;
Header = "Success";
public virtual IList<T> Result get; set;
T
应定义为泛型类,例如:
var msg = new ResultMessage();
var user = new User();
var list = new IList<User>();
list.Add(user);
msg.Result = list;
当然public virtual IList<T> Result get; set;
是错误的语法。
我怎样才能实现我的目标?
【问题讨论】:
也许还要考虑你的继承:ResultMessage
是 ErrorMessage
还是 ErrorMessage
是 ResultMessage
?因为ResultMessage
静态有httpStatus 200,所以肯定没有ErrorMessage
。你的继承似乎是可疑的。恕我直言,您应该有一个类ResultMessage
,它由SuccessMessage
(代码200)继承。并且有ErrorMessage
,也继承了ResultMessage
。
【参考方案1】:
您的ResultMessage
也必须是通用的:
public class ResultMessage<T> : ErrorMessage
调用时必须是这样的:
var msg = new ResultMessage<User>();
var user = new User();
var list = new List<User>();
list.Add(user);
msg.Result = list;
另一个提示:
列表属性不应该是可设置的。要么为此属性使用只读接口,如IReadOnlyList<T>
,要么将属性本身设为只读并在构造时对其进行初始化:
public class ResultMessage<T> : ErrorMessage
public IReadOnlyList<T> Result get; set;
public IList<T> Result get; = new List<T>();
【讨论】:
或者使用他们可以有自己的通用定义的方法,例如。void SetResult<T>(IList<T> result)
| IList<T> GetResult()
【参考方案2】:
List 实现了 IList 接口,你可以将 ResultMessage 作为一个泛型类,例如:
public class ResultMessage<T> : ErrorMessage
public ResultMessage()
httpStatus = 200;
Header = "Success";
Result = new List<T>();
public virtual IList<T> Result get; set;
var msg = new ResultMessage<User>();
var user = new User();
msg.Result.Add(user);
【讨论】:
以上是关于返回另一个类中的 IList<GenericClass> 属性的主要内容,如果未能解决你的问题,请参考以下文章
无法从“System.Collections.IList”转换为“System.Collections.Generic.IEnumerable<T>”