当前位置: 首页 > 编程语言 > C#

为什么这个TypeConverter不起作用?分享

时间:2023-04-11 01:44:45 C#

为什么这个TypeConverter不工作?我试图理解为什么下面的代码没有按预期工作;TypeDescriptor根本没有从属性中获取自定义转换器。我只能假设我犯了一个明显的错误,但我看不到。--编辑--当我自己在控制台中运行这段代码时,它似乎有效,我实际上是从一个更复杂的应用程序和一个不同的命名空间调用转换器。--编辑--或者关于如何调试TypeDescriptor的任何建议,这样我就可以看到发生了什么,然后我可以自己回答这个问题。--编辑--问题几乎肯定与不同组件中的片段有关。--编辑--由于动态加载程序集的一些怪癖,看起来这不起作用--此代码在具有类似体系结构的插件下运行。使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用系统绘图;使用System.ComponentModel;namespaceMyTest{publicclassTestTester{publicstaticvoidMain(string[]args){objectv=TypeDescriptor.GetConverter(typeof(MyTest.Test)).ConvertFromInvariantString("Test");}}publicclassTestConverter:TypeConverter{publicoverrideboolGetStandardValuesSupported(ITypeDescriptorContextcontext){returnfalse;}publicoverrideboolCanConvertFrom(ITypeDescriptorContextcontext,System.TypesourceType){if(sourceType==typeof(string)||base.CanConvertFrom(context,sourceType)){返回真;}returnbase.CanConvertFrom(context,sourceType);}publicoverrideboolCanConvertTo(ITypeDescriptorContextcontext,TypedestinationType){if(destinationType==typeof(Test)||base.CanConvertTo(destinationType)){返回真;}returnbase.CanConvertTo(context,destinationType);}公共覆盖objectConvertFrom(ITypeDescriptorContextcontext,System.Globalization.CultureInfoculture,objectvalue){if(value.GetType()==typeof(string)){Testt=newTest();}t.TestMember=值作为字符串;返回t;}returnbase.ConvertFrom(context,culture,value);}publicoverrideobjectConvertTo(ITypeDescriptorContextcontext,System.Globalization.CultureInfoculture,objectvalue,TypedestinationType){if(destinationType==typeof(string)&&value.GetType()==typeof(Test)){返回((测试)值).测试成员;}returnbase.ConvertTo(context,culture,value,destinationType);}}[TypeConverterAttribute(typeof(TestConverter))]publicstructTest{publicstringTestMember{get;放;我也有这个问题,问题的解决方案是订阅当前应用程序域的AssemblyResolve事件并手动解析程序集这远不是一个好的解决方案,但它似乎有效。我不知道为什么框架会这样。我自己真的很想找到一个不太难的方法来解决这个问题。publicvoidDoMagic(){//注意:在此之后,您可以使用您的类型转换器。AppDomain.CurrentDomain.AssemblyResolve+=newResolveEventHandler(CurrentDomain_AssemblyResolve);}privateAssemblyCurrentDomain_AssemblyResolve(objectsender,ResolveAppargentDomainsArg){Domainsender;foreach(Assemblyasmindomain.GetAssemblies()){if(asm.FullName==args.Name){returnasm;}}返回空值;我见过无法从其他程序集获取内部字段属性的情况。不确定它是.NET错误还是已修复。我唯一能做的就是在复杂的场景中,你可能没有反射权限。这有点晚了,但是当我要求一个TypeConverter驻留在可执行程序集未直接引用的另一个程序集中时,问题就出现了。这个问题的答案应该适用于此。这是比订阅AssemblyResolve更简单的解决方案。总而言之,想法是使用类型转换器类的完整字符串名称来设置TypeConverter属性,而不是使用typeof提供类名。我们还在可插入系统中观察到这种行为,涉及从appbase文件夹外部加载程序集。万恶之源是TypeDescriptorAttribute实现中的缺陷。该属性有两个构造函数重载,一个用于纯文本类型规范(不足为奇-运行时的纯魔法),一个用于早期绑定typeof()引用。如果您使用第二条路径,可能会出现什么问题?事实上,这个属性只使用了第一个路径。真实且正确的运行时类型引用被扁平化为明文,龙来了。所以写一个typeof()是没用的——它里面总是明文和魔法场景。解决方案?不理想,但在我们的例子中,我们只在系统中使用类型转换,所以我们选择了ValueSerializerAttribute。这基本上就是WPF做同样事情的方式。它的实现在typeof().ctor重载中是正确的,因为它成功地保留了早期绑定类型标识并始终加载正确的类型,如代码中所写。如果您希望系统(或WinForms)代码使用类型转换器,这将无济于事。以上是C#学习教程:为什么这个TypeConverter不行?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: