Как привести объект к типу на основе имени строкового класса, переданного в конструкторе — C#

Это мой пользовательский атрибут

 public class CaptureMetrics : ActionFilterAttribute
 {
    private readonly string _metricType;
    public CaptureMetrics(MetricTypes metricType)
    {
        _metricType = metricType.ToString();
    }
    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        try
        {
            string strJson;
            var reqPayload = context.HttpContext.Request.Body;
            using (var sr = new StreamReader(reqPayload))
            {
                strJson = await sr.ReadToEndAsync();
            }
            //Type t = Type.GetType(_metricType);
            //below I need to typecast the object to the equivalent DTO 
            var obj = JsonConvert.DeserializeObject(strJson); //line #
            // ToDo
        }
        catch (Exception)
        {
            //ToDo -> Log Exception
            throw;
        }
        finally
        {
            await next();
        }
    }
}

public enum MetricTypes
{
    ApiMetric
}

//DTO
public class ApiMetric
{
  //some properties
}

Из действия контроллера указанный выше атрибут используется, как показано ниже.

[CaptureMetrics(MetricTypes.ApiMetric)]
public async Task<IActionResult> Get([FromBody]ApiPayload payload)
{
}

В строке # мне нужно преобразовать полезную нагрузку запроса в эквивалентный класс DTO.

Для каждой записи в Enum (MetricType) у меня есть класс с тем же именем (например, ApiMetric).

Как привести объект сюда?


comment
Используйте перегрузку: DeserializeObject(String, Type). JsonConvert.DeserializeObject(strJson, t);   -  person Alexander Petrov    schedule 28.01.2021
comment
Отвечает ли это на ваш вопрос? Десериализовать JSON, ссылаясь на тип из имени строки в параметре типа   -  person Christoph Lütjen    schedule 28.01.2021
comment
Кстати: если вам нужен какой-то конвейер, но с типами (вместо необработанных запросов), MediatR может быть вариантом: github .com/jbogard/MediatR   -  person Christoph Lütjen    schedule 28.01.2021
comment
@ChristophLütjen, спасибо! но не совсем   -  person Kgn-web    schedule 28.01.2021
comment
Не уверен, правильно ли я понял вопрос, позвольте мне попытаться подытожить: теперь вы знаете, как десериализовать объект, но это неизвестно во время компиляции, поэтому obj имеет тип object, что означает, что вы не можете с ним работать. Это проблема?   -  person Christoph Lütjen    schedule 28.01.2021
comment
Вы имеете в виду, что хотите получить данные с типом ApiMetric. Я думаю, что его нельзя получить с помощью строки. Как сказали Alexander Petrov и Christoph Lütjen, вы можете использовать только JsonConvert.DeserializeObject(strJson, t) и получать данные из объекта.   -  person Yiyi You    schedule 29.01.2021
comment
@ChristophLütjen Спасибо! Да, ты правильно понял   -  person Kgn-web    schedule 29.01.2021
comment
Если вы хотите использовать словарь apporach, вам понадобится отражение afaik. Другими вариантами могут быть...: а) может быть общий интерфейс, который вы могли бы использовать? б) вы можете включить obj docs.microsoft .com/en-us/dotnet/csharp/language-reference/   -  person Christoph Lütjen    schedule 29.01.2021