是否可以从.net核心应用程序中的appsettings.json文件导入System.Type?

时间:2016-12-28 22:50:34

标签: c# .net-core

我正在尝试从appsettings.json文件中导入System.Type作为设置对象的一部分。对象的其余部分导入正常,但是当我向设置对象添加System.Type属性时,我得到以下异常:

  

Microsoft.Extensions.Configuration.Binder.dll中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

     

其他信息:无法将“MyType”转换为“System.Type”类型。

我的appsettings.json类似于:

"Settings": {
  "Url": "some url",
  "Type: "MyType"
}

我的设置对象如下:

public class Settings
{
    public string Url {get; set;}
    public Type Type {get; set;}
}

My Startup.cs包含使用它来绑定设置:

var foo = Configuration.GetSection("Settings").Get<Settings>(); // This is where the exception occurs.

显然,配置活页夹正在以MyType作为字符串读取,并且不知道如何将其转换为System.Type。是否可以在活页夹级别执行此操作,或者我是否需要进行一些反射以将该字符串转换为System.Type使用它的位置?

2 个答案:

答案 0 :(得分:0)

目前不支持此功能。配置库do not support从JSON文档中提取类型。

我通过添加辅助设置文件并使用Json.NET导入该特定配置对象来解决这个问题。

答案 1 :(得分:0)

有一个解决方法。

在 .net core 3.1 上使用以下 NuGet 包进行测试:

StringToTypeConverter 必须在应用程序启动时注册,然后才能对配置进行任何操作。

appsettings.json:

{
  "Settings": {
  "Url": "some URL",
  "Type": "System.String, mscorlib" /*Fully qualified type name*/
  }
}

代码:

class Program
{
    static void Main()
    {
        // Registration of StringToTypeConverter
        TypeDescriptor.AddAttributes(typeof(Type), new TypeConverterAttribute(typeof(StringToTypeConverter)));

        // Build configuration
        var configuration = new ConfigurationBuilder()
            .AddJsonFile("appsettings.json", false)
            .Build();

        var settings = configuration.GetSection("Settings").Get<Settings>();

        Console.WriteLine("Settings.Type: {0}", settings.Type);
    }

    public class Settings
    {
        public string Url { get; set; }
        public Type Type { get; set; }
    }

    internal class StringToTypeConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            return sourceType == typeof(string);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string stringValue)
            {
                return Type.GetType(stringValue);
            }
            return base.ConvertFrom(context, culture, value);
        }
    }
}