[英]instantiate generic type in generic method
我有這樣的結構
void Main()
{
var lol = ActionClass.GetTestTuple<Request, Response, RequestCallInfo>("lol", "user");
lol.Dump();
}
public class ActionClass
{
public static Tuple<TRes, TInfo> GetTestTuple<TReq, TRes, TInfo>(string resultMsg, string userName)
where TReq : BaseRequest, new()
where TRes : BaseResponse, new()
where TInfo : CallInfo<TReq>, new()
{
var response = new TRes { Message = resultMsg };
var eventsInfo = new TInfo();
eventsInfo.Data.UserName = userName;
return new Tuple<TRes, TInfo>(response, eventsInfo);
}
}
public class Request : BaseRequest
{
}
public class Response : BaseResponse
{
}
public class RequestCallInfo : CallInfo<Request>
{
public string Item { get; set; }
}
public class CallInfo<GenericType> : BaseCallInfo where GenericType : BaseRequest, new()
{
public GenericType Data { get; set; }
public CallInfo(GenericType x)
{
Data = x;
}
}
public class BaseCallInfo
{
public string CallItem { get; set; }
}
public class BaseRequest
{
public string UserName { get; set; }
}
public class BaseResponse
{
public string Message { get; set; }
}
當我執行它時,我得到UserQuery.CallInfo<UserQuery.Request> does not contain a constructor that takes 0 arguments,
所以我試過這種方式
public static Tuple<TRes, TInfo> GetTestTuple<TReq, TRes, TInfo>(string resultMsg, string userName)
where TReq : BaseRequest, new()
where TRes : BaseResponse, new()
where TInfo : CallInfo<TReq>, new()
{
var response = new TRes { Message = resultMsg };
var eventsInfo = new TInfo(new TReq { UserName = userName });
eventsInfo.Data.UserName = userName;
return new Tuple<TRes, TInfo>(response, eventsInfo);
}
但我得到'TInfo': impossible to provide arguments when instantiating a type
如何將TInfo
實例TReq
給TInfo
並僅在CallInfo<GenericType>
保留參數構造函數?
new()
約束只要求泛型類型具有公共參數構造函數; 無法在C#中的泛型類型/約束上指定特定的構造簽名。 鑒於此,編譯器無法知道調用者可以使用哪些構造函數,因此您無法使用構造函數參數實例化泛型類型。
因此,如果您願意,可以在此處使用反射,但根據您提供的代碼,此解決方案似乎更簡單:
var eventsInfo = new TInfo() { Data = new TReq { UserName = userName } };
您應該使用Activator.CreateInstance
方法。
工作方案:
public class ActionClass
{
public static Tuple<TRes, TInfo> GetTestTuple<TReq, TRes, TInfo>(string resultMsg, string userName)
where TReq : BaseRequest, new()
where TRes : BaseResponse, new()
where TInfo : CallInfo<TReq>
{
var response = new TRes { Message = resultMsg };
var eventsInfo = (TInfo)Activator.CreateInstance(typeof(TInfo), new []{ new TReq() });
eventsInfo.Data.UserName = userName;
return new Tuple<TRes, TInfo>(response, eventsInfo);
}
}
public class BaseCallInfo
{
public string CallItem { get; set; }
}
public class BaseRequest
{
public string UserName { get; set; }
}
public class BaseResponse
{
public string Message { get; set; }
}
public class Request : BaseRequest
{
}
public class Response : BaseResponse
{
}
public class RequestCallInfo : CallInfo<Request>
{
public string Item { get; set; }
public RequestCallInfo(Request x) : base(x)
{
}
}
public class CallInfo<GenericType> : BaseCallInfo where GenericType : BaseRequest, new()
{
public GenericType Data { get; set; }
public CallInfo(GenericType x)
{
Data = x;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.