2017-05-03 2 views
0

Wie erhält man zur Laufzeit den Namen der Klasse und den Namen der Methode dieser Klasse? Der Code wird kompiliert und dann mit einem Open-Source-Obfuscator verschleiert. Hier ein Beispiel:Abrufen von Klassen- und Methodennamen zur Laufzeit

class MainClass { 
    public static void Main(string[] args) { 
     Console.WriteLine(nameof(Test)); 
     Console.WriteLine(nameof(Test.TestMethod)); 
     Console.ReadLine(); 
    } 
} 

class Test { 
    public static void TestMethod() { 
     Console.WriteLine("Hello World!"); 
    } 
} 

Die obfuscator umbenennt Klassen und Methoden wie folgt aus:

MainClass -> A 
MainClass.Main -> A.a 
Test -> B 
Test.TestMethod -> B.a 

Wenn ich meinen Code nach der Kompilierung und Verschleierung laufen erhalte ich:

B 
TestMethod 

So ist die nameof funktioniert wie erwartet für den Klassennamen, funktioniert aber nicht für den Methodennamen. Wie funktioniert die nameof? Was ist der richtige Weg, um die verschleierten Namen der Klasse und der Methode zur Laufzeit zu bekommen?

+0

Warum müssen Sie wissen? Normalerweise ist dies kein Problem, es sei denn, Sie sagen, dass Sie eine API erstellen, die Sie veröffentlichen möchten, und möchten nicht, dass bestimmte Typen verschleiert werden (z. B. "IEndpoint.Send (IMessage)"). In diesem Fall würde ich an diesem Tag zurückrufen und Obfuscator sagen, eine bestimmte Klasse oder Methode auszuschließen. – MickyD

+0

nameof() wird zur Kompilierzeit ausgeführt. Sie können wahrscheinlich Reflektion dazu verwenden. –

+0

'nameof' ist eine Kompilierzeit-Funktion, daher ist es besonders seltsam, dass' nameof (Test) '' B' ergeben sollte, es sei denn, der Obfuscator führt Quelltextumschreibungen durch. Unabhängig davon, ob Sie den Namen einer Klasse zur Laufzeit verwenden möchten, verwenden Sie 'typeof (Test) .Name'. –

Antwort

0

Verwenden Sie die folgenden Schritte aus:

class MainClass { 
    public static void Main(string[] args) { 
     var methodinfo = typeof(Test).GetMethod("TestMethod"); 
     var handle = methodinfo.MetaDataToken; 
     MethodBase method = System.Reflection.MethodBase.GetMethodFromHandle(handle); 
     string methodName = method.Name; 
     string className = method.ReflectedType.Name; 

     string fullMethodName = className + "." + methodName; 
     Console.WriteLine(fullMethodName); 
     Console.ReadLine(); 
    } 
} 

class Test { 
    public static void TestMethod() { 
     Console.WriteLine("Hello World!"); 
    } 
} 
Verwandte Themen