2016-03-21 13 views
2

Ich möchte GetType und GetField vermeiden. Kann ich nur eine Zeichenfolge mit Ldsfld verwenden? Ich habe ein Modell von dem, was ich unten versuche zu erreichen. Wie Sie sehen können, bin ich neu in IL Generation - Ich versuche, einige der Kosten der Reflexion in meiner Anwendung zu entfernen.Kann ich OpCodes.Ldsfld ohne FieldInfo verwenden?

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

Sie müssen Reflektion verwenden, um die IL korrekt zu generieren. Der Punkt ist, dass Sie es nur einmal tun, die DynamicMethod kann beliebig oft verwendet werden und verwendet keine Reflektion. –

+0

Danke. In meiner Anwendung habe ich einen Child-Prozess, der viele Male gestartet wird und bei jedem Prozessstart die Reflektionskosten entstehen. Ich werde weitere Möglichkeiten untersuchen, wie ich Reflektionen entfernen/optimieren kann. – metafood

+1

Das macht zu wenig Sinn, ein Prozess zu starten ist um Größenordnungen teurer als eine Reflexion. Raten Sie nicht auf ein Perf-Problem, Sie werden falsch raten. –

Antwort

2

Nein, Sie können nicht, the documentation for OpCodes.Ldsfld sagt:

Die folgende Emit -Methodenüberladung die ldsfld Opcode verwenden:

  • ILGenerator.Emit(OpCode, FieldInfo)

Und Um FieldInfo zu bekommen, wenn Sie den Namen des Feldes kennen, müssen Sie Reflexion verwenden.