C# Передача типа переменной в обобщенный метод c и приведение объекта результата обратно к типу - PullRequest
0 голосов
/ 28 марта 2020

Я пытаюсь обдумать, как типы и обобщенные c методы работают с Newtonsoft.Json.
У меня есть следующий пример базового класса:

public class Foo
{
    public Type Expected;
    public object Result;
    public Foo()
    {
        Expected = typeof(RootObject);
    }
    public void Process()
    {
        string json = @"{
        'Foo': 'oof',
        'Baz': 0,
        'Bar': [
        'Yeet',
        'Skeet'
        ]
        }";
        Result = JsonConvert.DeserializeObject<Expected>(json); // -> doesnt work
    }
}

Я планирую при вызове метода Process() из производного класса после того, как я мог изменить тип класса Expected.
Однако, как этот вопрос указывает на то, что я обнаружил после небольшого исследования, передавая переменную Напечатайте метод generi c не так просто. Посмотрев немного подробнее, я обновил уязвимую строку так:

Result = ((Func<string, object>)JsonConvert.DeserializeObject).Method.MakeGenericMethod(Expected).Invoke(null, new object[]{json});

Это работает! • ᴗ •
Но результирующая переменная все еще является простой object, с которой довольно трудно справиться. Я пытался привести результат к типу Expected, но он просто не позволил мне.

Result = (Expected)((Func<string, object>)JsonConvert.DeserializeObject).Method.MakeGenericMethod(Expected).Invoke(null, new object[]{json});

говорит мне, что тип или пространство имен Expected не может быть найдено. В качестве более наивного подхода я попытался объявить свою собственность Result примерно так:

public Expected Result;

, но мои мечты не сбылись.
Я не уверен, как мне дальше подходить к этому получите объект Result типа Expected, чтобы я мог легко получить доступ к его свойствам или, если есть лучший способ go об этой проблеме типа-переменной-generi c -метода в целом.
У меня полная (примерная) разметка на dotnetfiddle , спасибо, что нашли время!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...