Dex*_*lem 11 .net c# reflection typedescriptor
我有一个简单的类型与自定义类型转换器,在运行时编译和加载.但是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<string, string>{{ "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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是示例的输出(在vs中编译)
LoadMe.Foo::q5sszdls, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Type converter type = 'System.ComponentModel.TypeConverter'
Run Code Online (Sandbox Code Playgroud)
我应该挖掘属性并自己创建实例,还是我在这里遗漏了其他东西?
还奇怪!当在LINQPad中作为"C#程序"运行时,它确实有效!这是输出.LINQPad准备好源码
LoadMe.Foo::oqmid5in, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
Type converter type = 'LoadMe.FooConverter'
Run Code Online (Sandbox Code Playgroud)
知道LINQPad实际上有什么不同才能让它找到合适的转换器吗?
小智 11
.NET使用反射来加载指定的类型转换器.将Type
实例传递给时TypeConverterAttribute
,您TypeConverterAttribute
将包含一个程序集限定的类型名称.加载该程序集限定的类型名称不起作用,因为无法找到程序集.(是的,即使已经加载了该程序集.)
您可以使用构造函数重载,它接受一个字符串来指定类型名称,而不引用定义程序集,在这种情况下,它将在与您请求的转换器类型相同的程序集中查找:
[TypeConverter("LoadMe.FooConverter")]
public class Foo
{
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2339 次 |
最近记录: |