在类属性中使用泛型类型T.

时间:2014-01-08 19:45:32

标签: c# generics

在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

数据属性将是一个不断变化的阶级,例如,它可能是一个人或雇主。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:6)

制作class generic

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