[英]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.