2016-03-21 37 views
2

GetType ve GetField'ı kullanmaktan kaçınmak istiyorum. Ldsfld ile bir string kullanabilir miyim? Aşağıda gerçekleştirmeye çalıştığım şeyin bir modelini ekledim. Gördüğünüz gibi ben IL Generation için yeniyim - Uygulamamdaki yansıma maliyetinin bir kısmını gidermeye çalışıyorum.FieldInfo kullanmadan OpCodes.Ldsfld kullanabilir miyim?

using System; 
using System.Reflection.Emit; 

namespace ConsoleApplication10 
{ 
    static class Program 
    { 
     public static string TextBox1 = "Hello World!"; 

     static void Main(string[] args) 
     { 
      var dm = new DynamicMethod("My_method", 
       typeof(string), null, true); 

      var il = dm.GetILGenerator(); 
      il.Emit(OpCodes.Ldsfld, "string ConsoleApplication10.Program::TextBox1"); 
      il.Emit(OpCodes.Ret); 
      var func = (Func<string>)dm.CreateDelegate(typeof(Func<string>)); 
      var s = func(); 

      Console.WriteLine(s); 
     } 
    } 
} 
+1

IL'yi doğru şekilde oluşturmak için yansımayı kullanmalısınız. Buradaki nokta, bir kere bunu yapabilmeniz, DynamicMethod'un herhangi bir sayıyı kullanabilmeniz ve * yansımayı kullanmamanız. –

+0

Teşekkürler. Uygulamamda birçok kez başlatılan bir çocuk sürecim var ve her süreçte yansıma maliyetine katlanıyorum. Yansıma kullanımımı kaldırmanın/optimize etmenin diğer yollarını araştıracağım. – metafood

+1

Bu, aşırı derecede az anlam ifade eder, bir sürecin başlaması, yansımadan daha pahalı olan büyüklükteki emirdir. Mükemmel bir problemde tahmin etmeyin, yanlış tahmin edersiniz. –

cevap

2

Hayır, the documentation for OpCodes.Ldsfld diyor edemez:

aşağıdaki Emit yöntem aşırı yük ldsfld işlem kodu kullanabilirsiniz:

  • ILGenerator.Emit(OpCode, FieldInfo)

Ve FieldInfo almak için alanın adını biliyorsanız, yansıma kullanmanız gerekir.

İlgili konular