是否可以在应用程序设置中存储和检索类型?

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; }
}