2014-09-29 10 views
9

Çalışma zamanında derlenmiş ve yüklenmiş özel bir tür dönüştürücüye sahip basit bir türüm var. TypeDescriptor.GetConverter() doğru dönüştürücüyü bulamıyor. İşte tek başına bir örnek BuradaTypeDescriptor.GetConverter() dönüştürücümü geri getirmiyor

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

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

Sadece niteliğini kazmak ve örneği oluşturmak kendim ya ben eksik Should (VS derlenmiş) örnek çıktısı olduğu Burada başka bir şey var mı?

AYRICA tek! LINQPad 'C# programı olarak çalıştırıldığında aslında işe yarıyor! İşte çıktı. LINQPad ready source

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

LINQPad aslında farklı olarak yaptıkları hakkında bir fikrin doğru dönüştürücü bulmak zorunda?

+0

böyle çalışmak gerekiyordu ve [hızlı bir online testi] (http://ideone.com/16utE6) öyle olduğunu gösterdiğinden. Tanımladığınız davranışı gösteren minimal bir tam program yayınlayabilir misiniz? – hvd

+0

hmm, türler çalışma zamanında derlenmiştir, bu nedenle nedeni olmalıdır. İzole bir örnek çırpacak –

+0

Sadece bir bağımsız örnek olarak düzenledim, bir düzenleme yorumunu unuttum: O –

cevap

8

.NET, belirtilen tür dönüştürücüyü yüklemek için yansımayı kullanır. Bir Type örneğini TypeConverterAttribute'a ilettiğinizde, TypeConverterAttribute, derleme özellikli bir tür adı içerecektir. Montaj bulunamadığı için, bu montaj nitelikli tür adını yükleme çalışmıyor. (Evet, bu derleme zaten yüklenmiş olsa bile.)

Tanımlayıcı aksamla ilgili herhangi bir referans olmadan tür adını belirtmek için bir dize alan kurucu yüklenicisini kullanabilirsiniz; bu durumda aynı şekilde bakılacaktır. dönüştürücü talep ettiğiniz türü olarak montaj:

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

Not: Ayrıca TypeDescriptor.AddAttributes kullanarak çalışma zamanında tip dönüştürücüler de ekleyebilirsiniz. Bu, ör. çünkü bir .NET framework türüdür. – Ananke

+0

Öyle aptalım, bu kavramı başka bir yerde mülk ızgarası editörleri için kullanıyordum ama beni tamamen terk etti –

+0

Bu cevap son derece yardımcı oldu. Referans olarak, çalışmak için "LoadMe" yerine tam nitelikli ad alanını kullanmak zorunda kaldım. – DaveInCaz

İlgili konular