C# 将自定义TypeConverter限制为特定程序集
我已经定义了一个自定义的C# 将自定义TypeConverter限制为特定程序集,c#,.net,typeconverter,customtypedescriptor,typedescriptionprovider,C#,.net,Typeconverter,Customtypedescriptor,Typedescriptionprovider,我已经定义了一个自定义的TypeConverter和相关的自定义TypeDescriptionProvider和TypeDescriptor,这样当从REST web服务返回值时(使用ASP.NET核心),我的类型会自动转换为字符串 但是,我现在注意到,在应用程序的其他地方(例如,当我序列化XML保存配置文件时,或在WPF中加载XAML时),正在调用我的自定义类型转换器 有没有办法限制我的自定义类型转换器/描述提供程序/描述符,使它们仅用于我的Web服务程序集中 更多信息 我的内部对象没有使用
TypeConverter
和相关的自定义TypeDescriptionProvider
和TypeDescriptor
,这样当从REST web服务返回值时(使用ASP.NET核心),我的类型会自动转换为字符串
但是,我现在注意到,在应用程序的其他地方(例如,当我序列化XML保存配置文件时,或在WPF中加载XAML时),正在调用我的自定义类型转换器
有没有办法限制我的自定义类型转换器/描述提供程序/描述符,使它们仅用于我的Web服务程序集中
更多信息
我的内部对象没有使用[TypeConverter()]
属性来指定要使用的类型转换器
正如答案所示,我正在使用AutoMapper将我的内部对象映射到数据传输对象。AutoMapper使用类型描述符
/类型转换器
,自动将对象的属性映射到字符串。我希望行为是这样,只有AutoMapper使用这个自定义类型转换器
但是,类型转换器似乎是全局注册的:TypeDescriptor.AddProvider(customerProvider,myType)
我看不出有什么方法可以将其限制在某些组件上。到目前为止,我唯一的想法是以某种方式使用ICustomTypeDescriptor
的GetComponentName()
(但这似乎总是null
)或在单独的AppDomain
中运行我的Web服务器,我认为这使用了单独的类型转换器,但可能会给封送/序列化带来巨大的问题。还有其他解决方案吗?一旦属性在模型上硬编码,那么在运行时很难更改/修改/禁用,也不可能删除。在您的情况下,即使在web应用程序中,也不能禁用或删除这些属性
我给你一个选项,多年来我一直使用它来做转换工作,特别是对于MVXX模式,无论是ASP.NET MVC还是WPF MVVM,它们都需要将视图模型转换为真实模型。AutoMapper按配置应用转换器,但不按属性应用转换器,这使您的请求成为可能
Mapper.Initialize(cfg=>{
CreateMap().ConvertUsing(新的ModelAToStringTypeConverter());
CreateMap().ConvertUsing(新的ModelAToBTypeConverter());
CreateMap().ConvertUsing(新的ModelBtoTypeConverter());
....
AddProfile();
});
公共类WpfProfile:配置文件
{
公共组织简介()
{
CreateMap();
//在此处使用CreateMap…等(配置文件方法与配置方法相同)
}
}
如果ModelA的属性是ModelB的一个子集,您甚至不需要硬编码转换器,cfg.CreateMap()
将自动完成这项工作
汽车制造商提及:
NET Framework还支持类型转换器的概念,
通过TypeConverter类。AutoMapper支持这些类型的
类型转换器,在配置检查和映射中,不带
需要任何手动配置。AutoMapper使用
TypeDescriptor.GetConverter方法,用于确定
可以映射源/目标类型对
事实上,我已经开始使用AutoMapper,它很棒!我最初没有提到它是为了避免混淆这个问题。但是,您给了我一个想法,就是重写我的“遗留”自定义System.ComponentModel.TypeConverter
类,以实现AutoMapper.ITypeConverter
,并完全避免整个TypeDescriptor
问题。
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)
}
}