gpt4 book ai didi

c# - 在泛型方法中实例化泛型类型

转载 作者:行者123 更新时间:2023-11-30 17:38:56 28 4
gpt4 key购买 nike

我有这样一个结构

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

如何传递 TReq 的实例?至 TInfo并只保留 CallInfo<GenericType> 中的参数构造函数?

最佳答案

new() 约束仅要求泛型类型具有公共(public)无参数构造函数;在 C# 中,无法在泛型类型/约束上指定特定的构造签名。鉴于此,编译器无法知道调用者可以使用哪些构造函数,因此您无法使用构造函数参数实例化泛型类型。

因此,如果您愿意,可以在此处使用反射,但根据您提供的代码,此解决方案似乎更简单:

var eventsInfo = new TInfo() { Data  = new TReq { UserName = userName } };

关于c# - 在泛型方法中实例化泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36183928/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com