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