O mümkün değildir güvenilir Eğer montaj olduğunu çözümlenen ediliyor komut dosyası için durum olabilir yöntemi açık olduğunu türünü içeren yüklü olması gerekir çünkü bir IMethodSymbol bir MethodInfo olsun ama analizi gerçekleştiren kod için değil olabilir. Başka bir deyişle, çalıştırdığınız komut dosyası kodunda, üzerinde M yöntemine sahip T türünde (ve böylece komut dosyası kodunun M yöntemini çağıran kodları olabilir) T bileşeni içeren yükleme X yüklü olabilir, ancak çözümleyici olabilir X yüklü ve bu yüzden can değil yük tipi T ve böylece
Ancak Sistemi gibi bir montaj için yöntem için M. bir MethodInfo örneği alınamıyor olabilir, muhtemelen oldukça güvenli bir bahis montaj olduğu konusunda sizi , numaralı telefona analizör kodundan erişebilir.
Yapmanız gereken tek şey, yönteme sahip olan türün adını ve tür adını almak ve bunun için bir TypeInfo örneği almaktır. Sonra GetMethod kullanın - bir MethodInfo almak için yöntem ve bağımsız değişken türleri adını geçirerek. Böyle bir şey:
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()
);
Bu analiz (Yukarıdaki kod çalışmaz yani) tam yansıma API erişimi olmayan genellikle taşınabilir sınıf kitaplıkları olduğunu belirtmek gerekir ama sadece kullanıyorsanız Roslyn bazı senaryoları analiz etmek için bir projede muhtemelen bu sınırlamaya sahip olmanıza gerek yok.