【问题标题】:How to have getter and setter of different data type如何拥有不同数据类型的getter和setter
【发布时间】:2021-09-14 04:03:23
【问题描述】:

如果我需要将以下代码转换为使用 ResponseStatus 输入进行设置,并在一个属性中提供一个带有字符串的 getter,如下所示公共字符串 ResponseStatus {get;设置;}

    private string _responseStatus;

    public string GetResponseStatus()
    {
        return _responseStatus.ToString();
    }

    public void SetResponseStatus(ResponseStatus responseStatus)
    {
        _responseStatus = responseStatus.ToString();
    }

如上需要更新如下,

public string ResponseStatus { 
        get { 
            return _responseStatus; 
        } 
        set { **// Need to check for the "ReponseStatus" type before setting this**
           _responseStatus = value.ToString(); } 
    }

但我需要确保值 ResponseStatus 仅设置为“ResponseStatus”类型的值

public enum ResponseStatus
{
    Failed = 0,
    Success = 1,
    PartialSuccess = 2
}

【问题讨论】:

  • 为什么不直接创建ResponseStatus 类型的整个属性呢?为什么你想要 getter 和 setter 的这种“不对称”?
  • @Sweeper 我希望将响应共享为属性的“字符串”,而不是作为客户端的枚举。如果它在响应中显示“失败/成功”而不是“0/1/2”,那么客户端很容易阅读
  • 但是客户端是计算机程序..?无论如何,如果这是 Json 序列化,您可以让序列化器发送和接收字符串枚举而不是数字...

标签: c# enums


【解决方案1】:

您不能拥有具有两种不同类型的属性,但您可以使用value object 概念来实现您所需要的。

例如,我假设你想要一个像这样的 DTO 类

public class TestDto
{
    public string ResponseStatus { get; set; } 
}

public enum ResponseStatuses
{
    Failed = 0,
    Success = 1,
    PartialSuccess = 2
}

你的 setter 应该是一个 Enum 并且你的 getter 应该返回字符串。 为此,您可以定义一个值对象类型。

// value object type example
public record ResponseStatus 
{
    private string _responseStatus;
    public ResponseStatus(ResponseStatuses responseStatus)
    {
        _responseStatus = responseStatus.ToString();    
    }
    public override string ToString()
    {
        return _responseStatus;
    }
    public static implicit operator ResponseStatus(ResponseStatuses value)
    {
        return new ResponseStatus(value);
    }
}

并在你的 DTO 中使用它

public class TestDto
{
    public ResponseStatus ResponseStatus {get; set;} // this always return string to the client
}

用法示例:

   var testResult = new TestDto();
   testResult.ResponseStatus = ResponseStatuses.Success;
   
   Console.WriteLine(testResult.ResponseStatus); // it is string "Success"

注意:在这个例子中,我使用了record 来定义一个值对象,但是如果你没有使用最新的c# 版本,那么other ways 来创建一个值对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多