C#通用属性

4

我正在尝试在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#中这是否可能?” - 指什么?小心使用诸如“找不到任何教程”的短语 - 寻求教程是离题的。 - Sinatr
你可能需要编写一个名为 GetData 的通用方法。 - Sweeper
2
可能是制作通用属性的重复问题。 - Cid
感谢您的回复。我打了一个我想要做的例子,当我刷新时收到了很多回复。 - vmp
3个回答

8
您需要在类中添加<T>,并将T用作属性的类型。
public class ResponseObject<T>
{
    public T data { get; set; }
    public Boolean Success { get; set; }
    public string Message { get; set; } 
}

7
你已经做得差不多了!只需要将你的<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

这里有两个选项:

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

第二种方法比第一种方法不够健壮 - 基本上,它只是一种被吹嘘的不受限制的转换。然而,第一种方法不允许您构建具有不同T的ResponseObject容器。您可以通过在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; } 
}

1
当我们可以通过属性来实现,为什么还需要使用 SetData 和 GetData 方法的原因是什么?只是好奇。 - Sнаđошƒаӽ
1
@Sнаđошƒаӽ 这正是因为你不能仅通过属性来实现它,而不使类成为泛型(考虑具有不同“T”的ResponseObject集合)。 - Sergey Kalinichenko
没有考虑到具有不同“T”的“ResponseObject”。所以,在这种情况下,你的方法是正确的。 - Sнаđошƒаӽ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接