簡體   English   中英

如何使用類型列表的參數創建泛型類型的實例

[英]How do I create an instance of a generic type with a parameter of type list

我有一個看起來像這樣的通用 class Result

public class Result<T>
{
    public List<Error> Errors { get; set; } = new List<Error>();

    public T ResultObject { get; set; }

    public Result(List<Error> errors)
    {
        Errors = errors;
        Success = false;
    }
}

我嘗試創建一個這樣的實例:

public Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
    var context = new ValidationContext<TRequest>(request);

    var failures = _validators
        .Select(v => v.Validate(context))
        .SelectMany(result => result.Errors)
        .Where(f => f != null)
        .ToList();

    if (failures.Count != 0)
    {
        var responseType = typeof(TResponse);
        // This is the important line
        return Task.FromResult(Activator.CreateInstance(responseType, new object[] { failures.Select(x => new Error(x.ErrorMessage)).ToList() }) as TResponse);
    }

    return next();
}

TResponse的類型為Result<GetUserFlow> GetUserFlow是一個 dto,但在這種情況下並不重要。 當我運行我的代碼時,我收到以下錯誤:

System.MissingMethodException:未找到“Heimdall.Application.Result`1[[Heimdall.Application.Dtos.GetUserFlow, Heimdall.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 類型的構造函數。

我想問題在於,當將列表作為參數傳遞時,它不是一個參數,而是多個參數。 每個創建的錯誤都是一個參數。 我找不到有關此主題的任何內容。

您可以使用以下方法調用正確的構造函數:

constructorInfo.Invoke(new object[] { failures.Select(x => new Error(x.ErrorMessage)).ToList() }) as TResponse

要獲取構造函數,請使用如下內容:

responseType.GetConstructors()[0]
// if you have multiple constructors, ensure the correct one with:
responseType.GetConstructor(new Type[]{ typeof(List<Error>) })

順便說一句,您可能會發現工廠模式要容易得多。

將工廠委托Func<List<Errors>, TResponse>傳遞給 Handle function 並使用該委托調用構造函數。

public Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken,
  RequestHandlerDelegate<TResponse> next, Func<List<Errors>, TResponse> responseCreator)
{
....
    return Task.FromResult(responseCreator(
        failures.Select(x => new Error(x.ErrorMessage)).ToList()
    ));
....
}

你這樣稱呼它:

 var result = Handle(...., errors => new Result<GetUserFlow>(errors));

暫無
暫無

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

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