9

IMethodSymbol (Roslyn 構文ツリー) から MethodInfo (反射) を確実に取得するにはどうすればよいですか。IMethodSymbol から Type を取得できます。この型には多くのメソッドがあり、そのうちの 1 つが IMethodSymbol インスタンスに一致します。

例えば

int i = 0;
i.Equals(5);

ここで、IMethodSymbol は「Equals」を識別します

[Int32] 型には 2 つの [Equals] メソッドがあり、1 つは [Object] を取得し、もう 1 つは [Int32] パラメータを取得します。

スクリプトを解析していますが、ワークスペース インスタンスがありません。

何か案は?ステボ

4

1 に答える 1

2

メソッドがオンになっている型を含むアセンブリを読み込む必要があるため、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 にアクセスできない (つまり、上記のコードは機能しない) 移植可能なクラス ライブラリであることに注意してください。その制限をする必要はありません。

于 2016-06-25T17:11:28.107 に答える