0

我定义了一个自定义TypeConverter和关联的自定义TypeDescriptionProviderTypeDescriptor以便在从 REST Web 服务(使用 ASP.NET Core)返回值时自动将我的类型转换为字符串。

但是,我现在注意到在我的应用程序的其他地方(例如,当我序列化 XML 以保存我的配置文件,或在 WPF 中加载 XAML 时)我的自定义TypeConverter正在被调用。

有没有办法限制我的自定义类型转换器/描述提供程序/描述符,以便它们仅在我的 Web 服务程序集中使用?


更多信息

我的内部对象没有使用[TypeConverter()]属性来指定要使用的类型转换器。

正如答案所暗示的,我正在使用 AutoMapper 进行从内部对象到数据传输对象的映射。AutoMapper 使用TypeDescriptor/TypeConverter将我的对象的属性自动映射到字符串。我希望这种行为只有AutoMapper 使用这个自定义类型转换器。

但是,类型转换器似乎是全局注册的:TypeDescriptor.AddProvider(customerProvider, myType)

我看不到将其限制为仅某些组件的方法。到目前为止,我唯一的想法是以某种方式使用GetComponentName()ICustomTypeDescriptor但这似乎总是null)或在单独的AppDomain. 还有其他解决方案吗?

4

1 回答 1

1

一旦属性在您的模型上被硬编码,那么在运行时将很难更改/修改/禁用,并且无法删除。在您的情况下,即使在 Web 应用程序中,您也无法禁用或删除这些属性。

我给你一个选项AutoMapper,多年来我一直在使用它来做转换工作,特别是对于 MVXX 模式,无论是 ASP.NET MVC 还是 WPF MVVM,它们都需要转换view modelsreal models. AutoMapper 通过配置而不是属性应用转换器,这使您的请求成为可能。

https://github.com/AutoMapper/AutoMapper/blob/master/docs/Custom-type-converters.md

Mapper.Initialize(cfg => {
  cfg.CreateMap<ModelA, string>().ConvertUsing(new ModelAToStringTypeConverter());
  cfg.CreateMap<ModelA, ModelB>().ConvertUsing(new ModelAToBTypeConverter());
  cfg.CreateMap<ModelB, ModelA>().ConvertUsing(new ModelBToATypeConverter());
  ....
  cfg.AddProfile<WpfProfile>();
});

public class WpfProfile: Profile
{
    public OrganizationProfile()
    {
        CreateMap<Foo, FooDto>();
        // Use CreateMap... Etc.. here (Profile methods are the same as configuration methods)
    }
}

如果 ModelA 的属性是 ModelB 的子集,您甚至不需要对转换器进行硬编码,cfg.CreateMap<ModelB, ModelA>()就会自动发挥作用。

AutoMapper 提到这一点

.NET Framework 还通过 TypeConverter 类支持类型转换器的概念。AutoMapper 支持这些类型的类型转换器,在配置检查和映射中,无需任何手动配置。AutoMapper 使用 TypeDescriptor.GetConverter 方法来确定是否可以映射源/目标类型对。

于 2018-07-25T17:33:34.990 回答