Можно ли сохранять и извлекать тип в настройках приложения?
Можно ли сохранить значение типа 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; }
}