【发布时间】:2020-11-12 00:03:29
【问题描述】:
我有以下代码:
public interface IResult
{
StatusCode Code { get; }
string Error { get; }
}
public interface IResult<T> : IResult
{
T Value { get; }
}
public class Result : IResult
{
public StatusCode Code { get; set; }
public string Error { get; set; }
}
public class Result<T> : IResult<T>
{
public StatusCode Code { get; set; }
public string Error { get; set; }
public T Value { get; set; }
}
我有两个接口:IResult 用于没有值的结果(如void)和IResult<T> 用于需要值的结果。但我不想支持两种不同的类型。我想将它们合并为单一类型。如果结果有值,则该值将存在,对于我没有任何值的情况,它将只是 null。
所以它是这样的: (涵盖所有情况)
public interface IResult<T>
{
StatusCode Code { get; }
string Error { get; }
T Value { get; }
}
public class Result<T> : IResult<T>
{
public StatusCode Code { get; set; }
public string Error { get; set; }
public T Value { get; set; }
}
但我正在努力解决T 是empty/null 的情况。如何为这种情况定义一个类?
到目前为止,我只发现了一个想法:
public class Result<NullValue> : IResult<NullValue>
{
public StatusCode Code { get; set; }
public string Error { get; set; }
public NullValue Value { get; set; }
}
public class NullValue
{
}
我正在寻找除此之外的任何其他想法:
public class ResultWithNoValue : IResult<T>
{
public StatusCode Code { get; set; }
public string Error { get; set; }
public object Value => null;
}
它不起作用,因为我必须使用:
public interface IBaseResponse< out T>
{
IResult<T> Data { get; }
}
而且这段代码是不可编译的:
public class ResponseWithNoValue : IBaseResponse<object>
{
public ResultWithNoValue Data { get; }
}
【问题讨论】:
-
我不确定我是否理解...
null不是一个类型,它是一个“值”(好吧,没有值。如果该值应该是引用类型)。那么怎么会有“T 为空的情况”呢?如果您有一个无法确定的类型(我猜),那么您期望逻辑是什么?。 -
为什么
null值需要单独的类型?为什么不使用default文字或保持T Value未设置,默认值(引用类型为null) -
适用于没有价值的情况。想象一下,有一个客户端向服务器发送命令以取消作业。服务器包含一个处理程序,它可以处理客户端请求并执行命令。取消本身是这样的:
void Cancel(Guid id){//...}- 没有返回类型它是void。但是处理程序可能会失败或取消本身抛出异常。客户需要此信息。 IResult描述它:错误和代码(如 OK、ClientError、ServerError) -
@PavelAnikhouski 我没明白。类型会是什么样子?我需要在“Result
”中添加 T。我不知道在我不关心的情况下该放什么(不仅仅是没有价值)。 -
@isxaker - 那么为什么
IResult<object>不能在那里工作呢?或者有一个完全独立的、无类型的IResult { SatusCode { get; } string Error { get; } },然后有IResult<T> : IResult { T Value { get; } }?
标签: c# .net generics inheritance interface