我有一个简单的类型与自定义类型转换器,在运行时编译和加载.但是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实际上有什么不同才能让它找到合适的转换器吗?