क्या मोनो में एक प्रकार के संदर्भ से जाने के लिए कोई रास्ता है। सेसिल एक प्रकार के लिए?Mono.Cecil प्रकार टाइप करने के लिए संदर्भ?
उत्तर
"बॉक्स में क्या है" के संदर्भ में आप 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 वर्णन किया गया है , सेसिल सम्मेलन के लिए सेसिल स्रोत कोड से परामर्श लें।
सामान्य प्रकार के लिए आप कुछ इस तरह की जरूरत है:
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;
}
कृपया इस कोड ध्यान दें नेस्टेड प्रकार संभाल नहीं है, कृपया इस
के लिए @JohannesRudolph जवाब जाँच भी ध्यान रखें कि Mono.Cecil नहीं ले सकता सिस्टम पर। रिफ्लेक्शन (एक स्वतंत्र पुस्तकालय होने के नाते), इसका मतलब है कि उन्हें एक-दूसरे में बदलने का कोई सीधा तरीका नहीं है। आपको अभी भी ऐसा करने में सक्षम होना चाहिए, लेकिन यह अच्छा नहीं लगेगा। – ShdNx
तो प्रतिबिंब के साथ मैं किस प्रकार के प्रकार को देखता हूं? और क्या आपके पास एक प्रतिबिंब नेस्टेड प्रकार और एक सेसिल घोंसला प्रकार का उदाहरण है? – Will
मैन्युअल रूप से "," जोड़ने के बजाय, आप असेंबली का उपयोग कर सकते हैं। CREateQualifiedName (tr.Module.Assembly.FullName, tr.FullName)। – user276648