返回另一个类中的 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; 

ResultMessageErrorMessage 相同,除了它还必须返回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&lt;T&gt; Result get; set; 是错误的语法。

我怎样才能实现我的目标?

【问题讨论】:

也许还要考虑你的继承:ResultMessageErrorMessage 还是 ErrorMessageResultMessage?因为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&lt;T&gt;,要么将属性本身设为只读并在构造时对其进行初始化:

public class ResultMessage<T> : ErrorMessage

    public IReadOnlyList<T> Result  get; set; 

    public IList<T> Result  get;  = new List<T>();

【讨论】:

或者使用他们可以有自己的通用定义的方法,例如。 void SetResult&lt;T&gt;(IList&lt;T&gt; result) | IList&lt;T&gt; 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>”

C#IList更新问题

无法将类型“IQueryable”隐式转换为 Generic.IList' 从 EF 上下文中检索记录列表作为列表

IList<> 返回类型而不是 List<>

如何在c#中访问另一个类中的一个类的私有函数?

在 C# 中返回 IList<T> vs Array?