instantiate generic type in generic method

Viewed 321

I have such a structure

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

and when I execute it, I get UserQuery.CallInfo<UserQuery.Request> does not contain a constructor that takes 0 arguments,

So i tried this way

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

but i'm getting 'TInfo': impossible to provide arguments when instantiating a type

How can I pass an instance of TReq to TInfo and keep only the parameter constructor in CallInfo<GenericType>?

2 Answers
Related