c#通用属性

时间:2018-07-10 09:47:36

标签: c# generics

我试图在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 
};

3 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:5)

您已经差不多完成了!只需将您的<T>更改为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确保泛型类型参数是引用类型。从您的问题看来,您似乎要在其中传递一个对象。

答案 2 :(得分:0)

您在这里有两个选择:

  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; } 
}

第二种方法不如第一种方法健壮-基本上,这是一种光荣的,不受限制的演员表。但是,第一种方法不允许您构建包含不同ResponseObject的{​​{1}}的容器。您可以通过在T顶部添加接口来解决此问题:

ResponseObject