Можно ли сохранять и извлекать тип в настройках приложения?

Можно ли сохранить значение типа Typeв настройках приложения? (Кроме того, это очень сложный вопрос для поиска!)

У меня есть такой класс, который я хочу сериализовать и сохранить в настройках приложения:

class MyClass{
    public Type StoredType {get; set;}
    public string Name {get; set;}
}

Я сериализовал объект

var obj = new MyClass{
    Name = "A String",
    StoredType = typeof(String)
};

var serialized = JsonConvert.SerializeObject(obj);

и сохранил его в настройках приложения:

"StoredClass" : {
    "StoredType" : "System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
    "Name" :  "A String"
}

Когда я пытаюсь загрузить объект из конфигурации, Name поле заполнено, но StoredType всегда равно нулю.

var configVal = _configuration.GetValue<MyClass>("StoredClass");

Assert.Equal(configVal.Name, "A String"); //passes
Assert.Equal(configVal.StoredType, typeof(String)); //fails
Assert.NotNull(configVal.StoredType); //fails

ОБНОВЛЕНИЕ: если я десериализую с помощью Newtonsoft, он работает, но конфигурация все еще не работает.

var deserialized = JsonConvert.DeserializeObject<MyClass>(serialized);

Assert.Equal(configVal.Name, "A String"); //passes
Assert.Equal(configVal.StoredType, typeof(String)); //passes
Assert.NotNull(configVal.StoredType); //passes

ЗАКЛЮЧЕНИЕ: у @Sam Axe есть решение, которое работает, и я в итоге его использовал. Я считаю, что причина проблемы в том, чтоTypeна самом деле абстрактный класс. Когда мы работаем сType в коде экземпляр обычно RuntimeType, который является частным классом в Systemпространство имен. Итак, похоже, Newtonsoft проделывает некоторые уловки, чтобы десериализовать это, но парсер JSON, используемый библиотекой конфигурации, - нет. Это имеет смысл, если учесть, что на самом деле вы не можете десериализовать строку в абстрактный класс.

1 ответ

Решение

Вы выводите строку в сериализованном тексте. Вам понадобится какой-нибудь метод преобразования строки в Тип. Есть много разных способов сделать это. Вот быстрый и грязный метод:

public class MyClass {
    private Type _myType = null;

    [JsonIgnore]
    public Type MyType {get { return _myType; }   set { _myType = value; } }

    public String StoredType {  
        get { return _myType.ToString(); }     
        set { _myType = Activator.CreateInstance(value); }
    }

    public string Name { get;set; }
}
Другие вопросы по тегам