是否可以在appsettings中存储和检索类型?

问题描述 投票:2回答:1

是否可以在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
c# asp.net-core appsettings asp.net-core-configuration
1个回答
0
投票

您正在以序列化文本输出字符串。您将需要一些将字符串重构为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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.