2009-08-14 2 views
6

मैं निम्नलिखित आईएल (परावर्तक से) सामान्यीकरण करने के लिए कोशिश कर रहा हूँ: DynamicMethod साथ जब मैं कोशिशऔर मूल्य प्रकार के साथ DynamicMethod "ऑपरेशन क्रम destablize सकता है"

.method private hidebysig instance void SetValue(valuetype Test.TestFixture/ValueSource& thing, string 'value') cil managed 
{ 
    .maxstack 8 
    L_0000: nop 
    L_0001: ldarg.1 
    L_0002: ldarg.2 
    L_0003: call instance void Test.TestFixture/ValueSource::set_Value(string) 
    L_0008: nop 
    L_0009: ret 
} 

हालांकि, और पुन: पेश इस आईएल:

 [Test] 
    public void Test_with_DynamicMethod() 
    { 
     var sourceType = typeof(ValueSource); 
     PropertyInfo property = sourceType.GetProperty("Value"); 

     var setter = property.GetSetMethod(true); 
     var method = new DynamicMethod("Set" + property.Name, null, new[] { sourceType.MakeByRefType(), typeof(string) }, true); 
     var gen = method.GetILGenerator(); 

     gen.Emit(OpCodes.Ldarg_1); // Load input to stack 
     gen.Emit(OpCodes.Ldarg_2); // Load value to stack 
     gen.Emit(OpCodes.Call, setter); // Call the setter method 
     gen.Emit(OpCodes.Ret); 

     var result = (SetValueDelegate)method.CreateDelegate(typeof(SetValueDelegate)); 

     var source = new ValueSource(); 

     result(ref source, "hello"); 

     source.Value.ShouldEqual("hello"); 
    } 

    public delegate void SetValueDelegate(ref ValueSource source, string value); 

मुझे "ऑपरेशन रनटाइम को अस्थिर कर सकता है" का अपवाद मिलता है। आईएल मेरे जैसा कोई विचार है, कोई विचार? ValueSource एक मान प्रकार है, इसलिए मैं यहां एक रेफ पैरामीटर कर रहा हूं।

संपादित

यहाँ ValueSource प्रकार है:

 public struct ValueSource 
    { 
     public string Value { get; set; } 
    } 
+0

(उम्मीद सरल) ValueSource का कोई भी मौका तो हम पुन: पेश कर सकते हैं ...? –

+1

इसके अलावा - मूल्य-प्रकार वास्तव में अपरिवर्तनीय होना चाहिए, जो इस मूत को प्रस्तुत करेगा ... –

उत्तर

4

बदलें 0/1 (नहीं 1/2) को आर्ग:

gen.Emit(OpCodes.Ldarg_0); // Load input to stack 
    gen.Emit(OpCodes.Ldarg_1); // Load value to stack 

क्योंकि गतिशील विधि ऐसा लगता है स्थैतिक के रूप में बनाया जाना चाहिए, उदाहरण नहीं (आपकी मूल विधि उदाहरण है) - इसलिए तर्क एक से दूर हैं।

(मूल गलत जवाब के लिए खेद है - आप true के रूप में कोड के अन्य बिट छोड़ सकते हैं)

+0

हाँ, वह था। अगली बार मैं अपना टेम्पलेट विधि स्थिर बना दूंगा। –

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