2017-05-03 21 views
0

実行時にこのクラスのメソッド名とクラス名を取得する方法。コードはコンパイルされ、オープンソースの難読化ツールを使用して難読化されます。次に例を示します。実行時にクラス名とメソッド名を取得する

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!"); 
    } 
} 

難読化ツールは、このようなクラスやメソッドの名前を変更します。

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

私はコンパイルと難読化の後に私のコードを実行すると、私が得る:

B 
TestMethod 

のでnameofクラス名には期待どおりに機能しますが、メソッド名には機能しません。 nameofはどのように機能しますか?実行時のクラスとメソッドの難読化された名前を取得する正しい方法は何ですか?

+0

あなたが知る必要があるのはなぜ?通常は、公開するAPIを作成していて、特定の型を難読化したくないと言っている場合を除き、問題はありません(例えば、 'IEndpoint.Send(IMessage)')。この場合、私はその日に戻って、Obfuscatorに特定のクラスまたはメソッドを除外するよう伝えます。 – MickyD

+0

nameof()はコンパイル時に実行されます。おそらくこれを行うためにリフレクションを使用することができます。 –

+0

'nameof'はコンパイル時の機能なので、obfuscatorがソースコードの書き換えを実行しない限り、' nameof(Test) 'は' B'を返すはずです。それとは関係なく、実行時にクラスの名前が必要な場合は、 'typeof(Test).Name'を使用します。 –

答えて

0

は、次を使用します。

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!"); 
    } 
} 
関連する問題