मेरे पास कुछ कोड है जो उत्पन्न प्रकार पर मिली सामान्य विधि के MethodInfo
का उपयोग करता है। कुछ प्रतिबिंब से बचने के लिए, मेरे पास कोडएक टाइपबिल्डर जेनरेटिक methodinfo जेनेरिक विधि क्यों उत्पन्न करता है?
ldtoken Method
ldtoken Type
call GetMethodFromHandle(RuntimeMethodHandle,RunTimeTypeHandle)
संकलन समय पर MethodInfos उत्पन्न करने के लिए पैटर्न का उपयोग करता है।
हालांकि, यदि methodInfo एक सामान्य प्रकार से संबंधित है और स्वयं एक सामान्य विधि है तो चीजें खराब हो जाती हैं। यहां कुछ कोड है जो केवल एक जीएम उत्पन्न करता है जो इसके methodInfo के खुले संस्करण को छोड़ देता है। अगर मैं इसे कहते से एक विशेष प्रकार मैं एक हैरान अपवाद ::
System.Reflection.MethodInfo
GM[M]()
पाने पर इसे बंद करने की कोशिश विधि को पुनः प्राप्त करने के लिए एक GenericMethodDefinition नहीं है। MakeGenericMethod को केवल उस विधि पर बुलाया जा सकता है जिसके लिए MethodBase.IsGenericMethodDefinition सत्य है।
यहाँ प्रासंगिक कोड ::
var aBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.RunAndSave);
var mBuilder = aBuilder.DefineDynamicModule(aBuilder.GetName().Name, true);
var typeBuilder = mBuilder.DefineType("NameSpace.Generic`1",TypeAttributes.AutoClass | TypeAttributes.Sealed | TypeAttributes.Public,typeof(object));
var TypeGenerics = typeBuilder.DefineGenericParameters(new[] { "T" });
var methodBuilder = typeBuilder.DefineMethod("GM", MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.HideBySig);
var methodGenerics = methodBuilder.DefineGenericParameters(new[] { "M" });
methodBuilder.SetSignature(typeof(MethodInfo), null, null, Type.EmptyTypes, null, null);
var ilgenerator = methodBuilder.GetILGenerator();
var typeBuilderClosedOverT = typeBuilder.MakeGenericType(TypeGenerics);
ilgenerator.Emit(OpCodes.Ldtoken, methodBuilder);
ilgenerator.Emit(OpCodes.Ldtoken, typeBuilderClosedOverT);
ilgenerator.Emit(OpCodes.Call,
typeof(MethodBase).GetMethod(
"GetMethodFromHandle",
BindingFlags.Public | BindingFlags.Static,
null,
new[] { typeof(RuntimeMethodHandle), typeof(RuntimeTypeHandle) },
null
)
);
ilgenerator.Emit(OpCodes.Castclass,typeof(MethodInfo));
ilgenerator.Emit(OpCodes.Ret);
var bakedType = typeBuilder.CreateType();
var methodInfo = bakedType.MakeGenericType(typeof(int)).GetMethod("GM").MakeGenericMethod(typeof(bool)).Invoke(null, null) as MethodInfo;
var methodInfoClosedOverBool = methodInfo.MakeGenericMethod(typeof(bool));
यह केवल समय मेरी कोड शिकंजा ऊपर लगता है कि यह एक गैर सामान्य प्रकार पर एक genericmethod है है। यदि कोड फिर से लिखा जाता है ताकि सामान्य प्रकार पर सामान्य विधि, या सामान्य प्रकार पर सामान्य विधि, या सामान्य प्रकार पर सामान्य विधि यह सब काम करे। यह केवल उन दोनों का संयोजन है जो त्रुटियों का कारण बनता है। क्या मुझसे कुछ गलत हो रही है? https://connect.microsoft.com/VisualStudio/feedback/details/775989/clr-cannot-emit-a-token-for-an-open-generic-method-on-a-generic-type
यह दिलचस्प है, ऐसा लगता है कि 'methodInfo.IsGenericMethodDefinition' वास्तव में' गलत 'है, हालांकि 'methodInfo.GetGenericArguments()' सामान्य पैरामीटर है जो एक प्रकार देता है। – svick
हाँ यह निरीक्षण कर रहा है निश्चित रूप से यह सामान्य चीज़ की तरह दिखता है सामान्य है। मेरा वर्तमान समाधान यह सुनिश्चित करना है कि मेरे तरीकों के पास अद्वितीय नाम हैं और 'टाइप' और' स्ट्रिंग 'में गुज़र रहे हैं, और' type.GetMethod (...) 'को कॉल करना है, लेकिन मैं प्रतिबिंब से बचना चाहता हूं। –
लगता है कि अब इसे .NET 4.7 –