2014-09-29 3 views
9

वापस नहीं करता है मेरे पास एक कस्टम प्रकार कनवर्टर के साथ एक साधारण प्रकार है जिसे संकलित और रनटाइम पर लोड किया गया है। 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<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' 

मैं सिर्फ अपने आप को विशेषता की खुदाई और उदाहरण बनाना चाहिए, या मुझे याद आ रही उदाहरण के उत्पादन में किया जाता है यहाँ कुछ और?

भी अजीब! जब LINQPad में 'सी # प्रोग्राम' के रूप में भाग गया, तो यह वास्तव में काम करता है! यहां आउटपुट है। LINQPad ready source

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

किसी भी विचार क्या LINQPad वास्तव में अलग ढंग से करता है यह सही कनवर्टर लगता है के लिए?

+0

ऐसा काम करने के लिए माना जाता है, और [एक त्वरित ऑनलाइन परीक्षण] (http://ideone.com/16utE6) से पता चलता है कि यह करता है। क्या आप एक न्यूनतम पूरा प्रोग्राम पोस्ट कर सकते हैं जो आपके द्वारा वर्णित व्यवहार का प्रदर्शन करता है? – hvd

+0

हम्म, प्रकार रनटाइम पर संकलित किए जाते हैं ताकि यह कारण हो। एक पृथक उदाहरण –

+0

मैं इसे एक स्टैंडअलोन उदाहरण के रूप में संपादित कर दूंगा, एक संपादन टिप्पणी भूल गया: O –

उत्तर

8

.NET निर्दिष्ट प्रकार कनवर्टर लोड करने के लिए प्रतिबिंब का उपयोग करता है। जब आप Type उदाहरण TypeConverterAttribute पर पास करते हैं, तो आपके TypeConverterAttribute में एक असेंबली-योग्य प्रकार का नाम होगा। लोड हो रहा है कि असेंबली-योग्य प्रकार का नाम काम नहीं करता है, क्योंकि असेंबली नहीं मिल सकती है। (हाँ, भले ही वह असेंबली पहले ही लोड हो चुकी है।)

आप कन्स्ट्रक्टर अधिभार का उपयोग कर सकते हैं जो परिभाषित असेंबली के किसी भी संदर्भ के बिना प्रकार का नाम निर्दिष्ट करने के लिए एक स्ट्रिंग लेता है, इस मामले में इसे उसी में देखा जाएगा प्रकार जिसका कनवर्टर आप अनुरोध कर रहे हैं के रूप में विधानसभा:

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

नोट: आप TypeDescriptor.AddAttributes का उपयोग कर रन टाइम पर टाइप कन्वर्टर्स भी जोड़ सकते हैं। यह उपयोगी है अगर आप प्रकार को संशोधित नहीं कर सकते हैं उदा। क्योंकि यह एक .NET ढांचा प्रकार है। – Ananke

+0

मैं इतना बेवकूफ हूं, मैं संपत्ति ग्रिड संपादकों के लिए कहीं और इस अवधारणा का उपयोग कर रहा था लेकिन यह पूरी तरह से मुझे –

+0

से बेदखल कर दिया गया था यह उत्तर बेहद सहायक था। संदर्भ के लिए, मुझे काम करने के लिए "लोडमे" के स्थान पर पूरी तरह से योग्य नामस्थान का उपयोग करना पड़ा। – DaveInCaz

संबंधित मुद्दे