Использование отражения с JsonSchema4.FromTypeAsync - PullRequest
0 голосов
/ 11 октября 2018

[INTRO] Я знаю, что повсюду около миллиона тестов на дженерики и рефлексы, но для меня это становится черной дырой, и чем больше я читаю, тем больше теряюсь !!

Что мне нужно сделать, это просто, и я поражен, что это не было решено ранее.

[SAMPLE] Рассмотрим следующий фрагмент:

public async Task<string> generateJsonSchema(string model)
{
    try
    {
        string modelName = "Models." + model;
        Type t = Type.GetType(modelName, false);
        JsonSchema4 schema = await JsonSchema4.FromTypeAsync<t>();
        return schema.ToJson();
    }
    catch (Exception ex)
    {
        Logger.WriteToLogFile(ex.ToString(), "exception");
        return "";
    }
}

[ПРОБЛЕМА] Теперь основная проблема заключается в том, что переменная t оценивается в время выполнения , таким образом, JsonSchema4.FromTypeAsync<t>()выдает ошибку 't' is a variable but is used like a type при попытке собрать время компиляции

Кто бы ни использовал JsonSchema4 поймет, чего я пытаюсь достичь здесь.Вместо создания функции генерации для каждой из моих моделей или создания логики switch / if-else,

[ВОПРОС] Как заставить его получить имя модели в виде строковый параметр , преобразовать строковое имя модели в тип модели и передать его методу jSonSchema4.

1 Ответ

0 голосов
/ 11 октября 2018

Проблема в том, что, как вы говорите, t оценивается как среда выполнения.

Я также столкнулся с этой проблемой и решил ее, создав MethodInfo метода, который я хотел вызвать,в вашем случае JsonSchema4.FromTypeAsync<t>().

Так что в принципе это желание может решить проблему:

    var methodInfo = typeof(JsonSchema4).GetMethod("FromTypeAsync", new Type[] { }); //Get the "normal method info", the overload without parameters
    var methodInfoWithType = methodInfo.MakeGenericMethod(t); //now you have a method with your desired parameter t as TypeParameter
    Task<JsonSchema4> task = methodInfoWithType.Invoke(null, null) as Task<JsonSchema4>; //now you can cast the result from invoke as Task to keep the Async-Await functionality
    var schema = await task;
    return schema.ToJson();
...