是否可以在应用程序设置中存储和检索类型?
Is it possible to store and retrieve a Type in appsettings?
是否可以在 appsettings 中存储 Type
类型的值? (另外,这是一个很难搜索的问题!)
我有一个像这样的 class,我想序列化并存储在应用程序设置中:
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 Ax 有一个可行的解决方案,我最终使用了它。我认为问题的原因是 Type
实际上是一个抽象 class。当我们在代码中使用 Type
时,实例通常是一个 RuntimeType
,它是 System
命名空间中的私有 class。因此,Newtonsoft 似乎在反序列化它,但 Configuration 库使用的 JSON 解析器却没有。当您认为实际上无法将字符串反序列化为抽象 class.
时,这是有道理的
您正在输出序列化文本中的字符串。您将需要一些方法将字符串重构为类型。有很多方法可以做到这一点。这是一个快速而肮脏的方法:
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; }
}
是否可以在 appsettings 中存储 Type
类型的值? (另外,这是一个很难搜索的问题!)
我有一个像这样的 class,我想序列化并存储在应用程序设置中:
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 Ax 有一个可行的解决方案,我最终使用了它。我认为问题的原因是 Type
实际上是一个抽象 class。当我们在代码中使用 Type
时,实例通常是一个 RuntimeType
,它是 System
命名空间中的私有 class。因此,Newtonsoft 似乎在反序列化它,但 Configuration 库使用的 JSON 解析器却没有。当您认为实际上无法将字符串反序列化为抽象 class.
您正在输出序列化文本中的字符串。您将需要一些方法将字符串重构为类型。有很多方法可以做到这一点。这是一个快速而肮脏的方法:
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; }
}