C# 是否可以在appsettings中存储和检索类型?
是否可以在appsettings中存储类型为C# 是否可以在appsettings中存储和检索类型?,c#,asp.net-core,appsettings,asp.net-core-configuration,C#,Asp.net Core,Appsettings,Asp.net Core Configuration,是否可以在appsettings中存储类型为type的值?(而且,这是一个很难搜索的问题!) 我有这样一个类,我想序列化并存储在appsettings中: class MyClass{ public Type StoredType {get; set;} public string Name {get; set;} } "StoredClass" : { "StoredType" : "System.String, System.Private.CoreLib, Ver
type
的值?(而且,这是一个很难搜索的问题!)
我有这样一个类,我想序列化并存储在appsettings中:
class MyClass{
public Type StoredType {get; set;}
public string Name {get; set;}
}
"StoredClass" : {
"StoredType" : "System.String, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e",
"Name" : "A String"
}
我已序列化该对象
var obj = new MyClass{
Name = "A String",
StoredType = typeof(String)
};
var serialized = JsonConvert.SerializeObject(obj);
并将其存储在appsettings中:
class MyClass{
public Type StoredType {get; set;}
public string Name {get; set;}
}
"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
var configVal=\u configuration.GetValue(“StoredClass”);
Assert.Equal(configVal.Name,“一个字符串”)//通行证
等于(configVal.StoredType,typeof(String))//失败
Assert.NotNull(configVal.StoredType)//失败
更新:如果我用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
var反序列化=JsonConvert.DeserializeObject(序列化);
Assert.Equal(configVal.Name,“一个字符串”)//通行证
等于(configVal.StoredType,typeof(String))//通行证
Assert.NotNull(configVal.StoredType)//通行证
结论:
@Sam Axe有一个有效的解决方案,我最终使用了它。我认为问题的原因是
Type
实际上是一个抽象类。在代码中使用类型
时,实例通常是运行时类型
,它是系统
命名空间中的私有类。因此,Newtonsoft似乎在做一些反序列化的把戏,但配置库使用的JSON解析器却不是。当你不能真正将一个字符串反序列化到抽象类时,这是有意义的。 你在序列化文本中输出一个字符串。您将需要某种方法将字符串重新构造为类型。有很多方法可以做到这一点。这里有一个快速而肮脏的方法:
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; }
}
如果有必要,我想我可以这样做,但我不确定为什么在代码中序列化的东西在没有帮助的情况下不能反序列化。