TypeDescriptor.GetConverter()不会返回我的转换器

我有一个简单的类型与自定义类型转换器,在运行时编译和加载。 但是,TypeDescriptor.GetConverter()找不到合适的转换器。 这是一个独立的例子

using System; using System.ComponentModel; using System.Collections.Generic; using System.CodeDom.Compiler; using Microsoft.CSharp; public class Program { private static string src = @" using System; using System.ComponentModel; namespace LoadMe { [TypeConverter(typeof(FooConverter))] public class Foo { } public class FooConverter : TypeConverter { // stuff } } "; public static void Main() { var codeProvider = new CSharpCodeProvider(new Dictionary{{ "CompilerVersion", "v4.0" }}); var compileParameters = new CompilerParameters(new[] { "System.dll" }) { GenerateInMemory = true }; var compilerResults = codeProvider.CompileAssemblyFromSource(compileParameters, src); if (compilerResults.Errors.Count == 0) { var fooType = compilerResults.CompiledAssembly.GetType("LoadMe.Foo"); Console.WriteLine(fooType.FullName + "::" + fooType.Assembly.FullName); Console.WriteLine("Type converter type = '" + TypeDescriptor.GetConverter(fooType).GetType().FullName + "'"); } else { foreach (var err in compilerResults.Errors) Console.WriteLine(err); } } } 

这是示例的输出(在vs中编译)

 LoadMe.Foo::q5sszdls, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null Type converter type = 'System.ComponentModel.TypeConverter' 

我应该挖掘属性并自己创建实例,还是我在这里遗漏了其他东西?

还奇怪! 当在LINQPad中作为“C#程序”运行时,它确实有效! 这是输出。 LINQPad就绪源码

 LoadMe.Foo::oqmid5in, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null Type converter type = 'LoadMe.FooConverter' 

知道LINQPad实际上有什么不同才能让它找到合适的转换器吗?

.NET使用reflection来加载指定的类型转换器。 将Type实例传递给TypeConverterAttributeTypeConverterAttribute将包含程序集限定的类型名称。 加载该程序集限定的类型名称不起作用,因为无法找到程序集。 (是的,即使已经加载了该程序集。)

您可以使用构造函数重载,它接受一个字符串来指定类型名称,而不引用定义程序集,在这种情况下,它将在与您请求的转换器类型相同的程序集中查找:

 [TypeConverter("LoadMe.FooConverter")] public class Foo { }