我在ASP.NET Core 1.1解决方案中使用配置绑定。基本上,我在我的ConfigureServices Startup部分中有一些简单的绑定代码,如下所示:
services.AddSingleton(Configuration.GetSection("SettingsSection").Get<SettingsClass>());
皱纹是我的类作为int属性,通常绑定到配置文件中的int值,但可以绑定到字符串“disabled”。在引擎盖下,我希望属性的值为-1,如果它绑定到字符串“disabled”。
它可能比这更复杂,但为了简洁起见我正在简化。
我的问题是:如何为其提供自定义绑定器/转换器覆盖SettingsClass中特定属性的配置绑定,以便在执行字符串转换时将“disabled”转换为-1,而不是抛出“禁用”无法转换为Int32的异常?
答案 0 :(得分:4)
看来,由于ConfigurationBinder使用类型的TypeDescriptor来获取转换器,我做我想做的唯一方法是实现自定义类型转换器并将其插入类I的TypeDescriptor中m转换为(在本例中为Int32)。
所以,基本上,在配置发生之前添加它:
TypeDescriptor.AddAttributes(typeof(int), new TypeConverterAttribute(typeof(MyCustomIntConverter)));
MyCustomIntConverter看起来像这样:
public class MyCustomIntConverter : Int32Converter
{
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
if (value != null && value is string)
{
string stringValue = value as string;
if(stringValue == "disabled")
{
return -1;
}
}
return base.ConvertFrom(context, culture, value);
}
}
似乎有点矫枉过正,因为现在“禁用”对于应用程序中的任何地方的Int32始终会保持-1。如果有人知道这种侵入性较小的方法,请告诉我。
答案 1 :(得分:0)
我最近偶然发现了一个相同的问题,并提出了稍微不同的解决方案。
我的想法是使用默认绑定机制。就我而言,我想获取新的HashSet
实例,其值存储在数据库中的proper array format中。我创建了一个类,该类将我的配置绑定到一个与我的配置中名称相同的private
属性和一个public
属性中,该属性使用private
一个属性为我创建一个{{ 1}}。看起来像这样:
HashSet
和// settings.json
{
option: {
ids:[1,2,3],
}
}
class
然后,您可以使用public class Options
{
public HashSet<int> TrueIds
{
get
{
return RestrictedCategoryIds?.ToHashSet();
}
}
private int[] Ids{ get; set; }
}
确保活页夹将填充您的BindNonPublicProperties
属性。
private
您说在您的情况下,这可能不像将“禁用”转换为-1那样简单,但是也许我的想法会激发您以不同的方式解决这一问题。