Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将自定义TypeConverter限制为特定程序集_C#_.net_Typeconverter_Customtypedescriptor_Typedescriptionprovider - Fatal编程技术网

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)
    }
}