2010-11-15 7 views

उत्तर

20

"बॉक्स में क्या है" के संदर्भ में आप ModuleDefinition.Import एपीआई का उपयोग करके इसे दूसरे तरीके से गोल कर सकते हैं।

TypeReference से System.Type पर जाने के लिए आपको प्रतिबिंब और AssemblyQualifiedName का उपयोग करके इसे मैन्युअल रूप से देखना होगा। ध्यान रखें कि सेसिल ने नेस्टेड कक्षाओं से बचने के लिए आईएल सम्मेलनों का उपयोग किया है, इसलिए आपको कुछ मैन्युअल सुधार लागू करने की आवश्यकता है।

यदि आप केवल गैर-जेनेरिक, गैर-नेस्टेड प्रकारों को हल करना चाहते हैं तो आपको ठीक होना चाहिए।

एक TypeReference से एक TypeDefition पर जाने के लिए (यदि आप क्या मतलब है कि) आप के लिए की जरूरत है TypeReference.Resolve();


अनुरोधित कोड नमूना:

TypeReference tr = ... 
Type.GetType(tr.FullName + ", " + tr.Module.Assembly.FullName); 
// will look up in all assemnblies loaded into the current appDomain and fire the AppDomain.Resolve event if no Type could be found 

प्रतिबिंब में इस्तेमाल किया सम्मेलनों here वर्णन किया गया है , सेसिल सम्मेलन के लिए सेसिल स्रोत कोड से परामर्श लें।

+0

के लिए @JohannesRudolph जवाब जाँच भी ध्यान रखें कि Mono.Cecil नहीं ले सकता सिस्टम पर। रिफ्लेक्शन (एक स्वतंत्र पुस्तकालय होने के नाते), इसका मतलब है कि उन्हें एक-दूसरे में बदलने का कोई सीधा तरीका नहीं है। आपको अभी भी ऐसा करने में सक्षम होना चाहिए, लेकिन यह अच्छा नहीं लगेगा। – ShdNx

+0

तो प्रतिबिंब के साथ मैं किस प्रकार के प्रकार को देखता हूं? और क्या आपके पास एक प्रतिबिंब नेस्टेड प्रकार और एक सेसिल घोंसला प्रकार का उदाहरण है? – Will

+7

मैन्युअल रूप से "," जोड़ने के बजाय, आप असेंबली का उपयोग कर सकते हैं। CREateQualifiedName (tr.Module.Assembly.FullName, tr.FullName)। – user276648

2

सामान्य प्रकार के लिए आप कुछ इस तरह की जरूरत है:

public static Type GetMonoType(this TypeReference type) 
    { 
     return Type.GetType(type.GetReflectionName(), true); 
    } 

    private static string GetReflectionName(this TypeReference type) 
    { 
     if (type.IsGenericInstance) 
     { 
      var genericInstance = (GenericInstanceType)type; 
      return string.Format("{0}.{1}[{2}]", genericInstance.Namespace, type.Name, String.Join(",", genericInstance.GenericArguments.Select(p => p.GetReflectionName()).ToArray())); 
     } 
     return type.FullName; 
    } 

कृपया इस कोड ध्यान दें नेस्टेड प्रकार संभाल नहीं है, कृपया इस