是否可以在appsettings中存储类型为Type
的值? (而且,这是一个很难解决的问题!)
我有一个这样的类,我想序列化并存储在appsettings中:
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);
并将其存储在appsettings中:
"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
您正在以序列化文本输出字符串。您将需要一些将字符串重构为Type的方法。有很多方法可以做到这一点。这是一种快速而肮脏的方法:
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; }
}