【问题标题】:c# Generic propertyc# 通用属性
【发布时间】:2018-12-18 02:42:24
【问题描述】:

我正在尝试在 C# 中创建一个可用于返回任何类型数据的类。

public class ResponseObject
{
    public <T> data { get;set }
    public Boolean Success { get; set; }
    public string Message { get; set; } 
}

当我的应用程序向 API 发送请求时,该对象将成为响应对象的包装器。

我已尝试对此进行研究,但找不到与我正在尝试做的事情相关的任何教程。

这在 C# 中可行吗?响应对象将被转换为 JSON 字符串,然后作为响应发送。

我不会对这个对象进行任何处理,因为这已经完成了。我只想将数据放在 ResponseObject 中并发送

我想做一些类似的事情:

var customers = repository.GetCustomers();
var orders = repository.GetOrders();
if(customers)
{
  success = true;
  message = "";
}
else{
   success = false;
   message = "failed to get customers";
}
if(orders)
{
  orderssuccess = true;
  ordersmessage = "";
}
else{
   orderssuccess = false;
   ordersmessage = "failed to get orders";
}
ResponseObject customerResponse = new ResponseObject{
    data = customers,
    success = success,
    message = message 
};
ResponseObject orderResponse = new ResponseObject{
    data = orders,
    success = orderssuccess,
    message = ordersmessage 
};

【问题讨论】:

  • “这在 C# 中可行吗?” - 究竟是什么?小心使用 “找不到任何教程” 之类的短语 - 要求教程是题外话。
  • 您可能需要编写一个名为GetData 的通用方法。
  • Making a generic property的可能重复
  • 为您的所有回复干杯。我输入了一个我想做什么的例子,当我刷新时得到了很多回复

标签: c# generics


【解决方案1】:

您需要将 添加到类中并使用 T 作为您的属性的类型。

public class ResponseObject<T>
{
    public T data { get; set; }
    public Boolean Success { get; set; }
    public string Message { get; set; } 
}

【讨论】:

    【解决方案2】:

    您几乎已经完成了!只需将您的 &lt;T&gt; 更改为 T

    public class ResponseObject<T> where T : class
    {
        public T data { get; set; }
        public Boolean Success { get; set; }
        public string Message { get; set; } 
    }
    

    这里where T : class 确保泛型类型参数是引用类型。从您的问题看来,您将在那里传递一个对象。

    【讨论】:

      【解决方案3】:

      这里有两个选择:

      1. 使类成为通用类,或者
      2. 使用通用方法访问属性

      以下是这两种方法的示例:

      // Make the class generic
      public class ResponseObject<T> {
          public T Data { get; set }
          public Boolean Success { get; set; }
          public string Message { get; set; } 
      }
      
      // Use generic methods to access the property
      public class ResponseObject {
          private object data;
          public T GetData<T>() {
              return (T)data;
          }
          public void SetData<T>(T newData) {
              data = newData;
          }
          public Boolean Success { get; set; }
          public string Message { get; set; } 
      }
      

      第二种方法不如第一种强大 - 基本上,它是一种美化的不受限制的演员阵容。然而,第一种方法不允许您使用不同的Ts 构建ResponseObjects 的容器。您可以通过在ResponseObject之上添加一个接口来解决这个问题:

      interface IResponseObject {
          object DataObj { get; set }
          Type ObjType { get; }
          bool Success { get; set; }
          string Message { get; set; } 
      }
      public class ResponseObject<T> {
          public T Data { get; set }
          public ObjType => typeof(T);
          public DataObj {
              get => Data;
              set => Data = value; // C# 7 syntax
          }
          public Boolean Success { get; set; }
          public string Message { get; set; } 
      }
      

      【讨论】:

      • SetData 和 GetData 方法的确切原因是什么,当我们可以只使用属性时呢?只是好奇
      • @Sнаđошƒаӽ 原因正是你不能只使用属性而不使类通用(想想ResponseObjects 与不同T 的集合s)。
      • 没想到ResponseObjects 和Ts 不一样。所以是的,在这种情况下,你的方法就是这样做。
      猜你喜欢
      • 1970-01-01
      • 2011-02-04
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多