代码之家  ›  专栏  ›  技术社区  ›  g t Omri Btian

将自定义类型转换器限制为特定程序集

  •  0
  • g t Omri Btian  · 技术社区  · 8 年前

    我定义了一个习惯 TypeConverter 和相关的自定义 TypeDescriptionProvider TypeDescriptor 这样,当从RESTWeb服务(使用ASP.NET核心)返回值时,我的类型将自动转换为字符串。

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

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


    更多信息

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

    正如答案所示,我正在使用automapper从内部对象映射到数据传输对象。是automapper利用了 类型描述符 / 类型转换器 ,自动将对象的属性映射到字符串。我希望行为是这样的 只有 automapper使用这个自定义类型转换器。

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

    我看不出一种方法可以将此限制为仅限某些组件。到目前为止我唯一的想法是 GetComponentName() ICustomTypeDescriptor (但这似乎总是 null )或者单独运行我的Web服务器 AppDomain ,我假设它使用单独的类型转换器,但可能会给封送/序列化带来巨大的问题。还有别的办法吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Dongdong    8 年前

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

    我给你一个选择, AutoMapper ,多年来我一直用它来做转换工作,特别是对于MVXX模式,无论是ASP.NET MVC还是WPF MVVM,都需要转换。 view models real 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>() 会自动变魔术。

    自动提示 this :

    .NET框架还支持类型转换器的概念, 通过typeconverter类。automapper支持以下类型 类型转换器,在配置检查和映射中,没有 需要任何手动配置。automapper使用 用于确定 可以映射源/目标类型对。