メソッドがオンになっている型を含むアセンブリを読み込む必要があるため、IMethodSymbol から MethodInfoを確実に取得することはできません。これは、解析中のスクリプトの場合には当てはまりますが、コードの場合には当てはまらない可能性があります。つまり、分析を実行しています。
つまり、実行しているスクリプト コードには、メソッド M を持つ型 T を含むアセンブリ X が読み込まれている可能性があります (そのため、スクリプト コードにはメソッド M を呼び出すコードを含めることができます) が、アナライザーにはアセンブリ X が読み込まれておらず、そのため、タイプ T をロードできず、メソッド M の MethodInfo インスタンスを取得できません。
ただし、System のようなアセンブリの場合、アナライザー コードからアクセスできることはおそらくかなり安全な賭けです。
したがって、メソッドを持つ型の名前空間と型名を取得し、その TypeInfo インスタンスを取得するだけで済みます。次に、GetMethod を使用して、メソッドの名前と引数の型を渡し、MethodInfo を取得します。このようなもの:
var invocation = (InvocationExpressionSyntax)context.Node;
var methodSymbol = (IMethodSymbol)context.SemanticModel.GetSymbolInfo(invocation).Symbol;
var declaringTypeName = string.Format(
"{0}.{1}",
methodSymbol.ContainingType.ContainingAssembly.Name,
methodSymbol.ContainingType.Name
);
var methodName = methodSymbol.Name;
var methodArgumentTypeNames = methodSymbol.Parameters.Select(
p => p.Type.ContainingNamespace.Name + "." + p.Type.Name
);
var methodInfo = Type.GetType(declaringTypeName).GetMethod(
methodName,
methodArgumentTypeNames.Select(typeName => Type.GetType(typeName)).ToArray()
);
アナライザーは、多くの場合、完全なリフレクション API にアクセスできない (つまり、上記のコードは機能しない) 移植可能なクラス ライブラリであることに注意してください。その制限をする必要はありません。