簡體   English   中英

在類屬性中使用泛型T

[英]Using Generic Type T in a class property

在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

數據屬性的類別將不斷變化,例如,可能是個人或雇主。

任何幫助,將不勝感激。

使您的類通用

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

注意 :我喜歡創建擴展方法 ,這些方法根據我擁有的數據創建響應對象:

public static DataResponse<T> ToSuccessResult<T>(this T data)
{
    return new DataResponse<T> {
                  Success = true;
                  ResponseMessage = "OK";
                  Data = data
               };
}

現在可以從您的數據類型推斷出T類型,並且響應創建將如下所示:

var response = personData.ToSuccessResult();

您需要在類級別聲明通用類型參數:

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

只有方法和類型可以是通用的。 這意味着您不能聲明通用屬性。 您能做的最好的事情就是使包含屬性的類通用。

public class DataResponse<T>
{
    public T Data { get; set; }
}

按照Sergey Berezovskiy和pswg的建議,使您的類通用。此外,您可能要求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; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM