在c#中,我如何设置一个可以返回另一个类(任何类型)的类。
例如:
public class DataResponse {
public bool Success {get;set;}
public string ResponseMessage {get;set;}
public T Data {get;set;}
}
T应该是任何类型的。
var personData = new PersonClass() {
FirstName= "John",
LastName="Doe"
};
var response = new DataResponse<EmployeeClass>() {
Success = true;
ResponseMessage = "OK";
Data = personData
}
然后我就可以去了
response.Data.FirstName
数据属性将是一个不断变化的阶级,例如,它可能是一个人或雇主。
任何帮助都将不胜感激。
答案 0 :(得分:6)
public class DataResponse<T> // class is parametrized with T
{
public bool Success {get;set;}
public string ResponseMessage {get;set;}
public T Data {get;set;}
}
现在您的代码将起作用 - 使用某种特定类型创建参数化的类,Data
属性将具有该类型:
var response = new DataResponse<EmployeeClass> {
Success = true;
ResponseMessage = "OK";
Data = personData
};
注意:我想创建基于我拥有的数据创建响应对象的extension methods:
public static DataResponse<T> ToSuccessResult<T>(this T data)
{
return new DataResponse<T> {
Success = true;
ResponseMessage = "OK";
Data = data
};
}
现在可以从您的数据类型中推断出T
的类型,并且响应创建将如下所示:
var response = personData.ToSuccessResult();
答案 1 :(得分:3)
您需要在类级别声明泛型类型参数:
public class DataResponse<T> // <-- here
{
public bool Success {get;set;}
public string ResponseMessage {get;set;}
public T Data {get;set;}
}
现在,只要EmployeeClass
有一个名为FirstName
的属性,就可以了:
var personData = new PersonClass() {
FirstName = "John",
LastName = "Doe"
};
var response = new DataResponse<EmployeeClass>() {
Success = true;
ResponseMessage = "OK";
Data = personData
};
Console.WriteLine(response.Data.FirstName); // John
答案 2 :(得分:2)
只有方法和类型可以是通用的。这意味着您无法声明通用属性。您可以做的最好的事情是使包含该属性的类通用。
public class DataResponse<T>
{
public T Data { get; set; }
}
答案 3 :(得分:0)
根据Sergey Berezovskiy和p.s.w.g的建议,让你的班级变得通用。此外,您可以要求T是实现FirstName和LastName的类型:
public interface INamable
{
string FirstName { get; set; }
string LastName { get; set; }
}
public class DataReponse<T> where T : INamable
{
public bool Success { get; set; }
public string ResponseMessage { get; set; }
public T Data { get; set; }
}