2015-05-29 25 views
8

Metodolojiyi (yansıma), IMethodSymbol'dan (Roslyn sözdizimi ağacı) nasıl güvenilir bir şekilde alabilirim. Türünü IMethodSymbol'dan alabilirim ve türünde IMethodSymbol örneğiyle eşleşen birçok yöntem vardır.Roslyn, IMethodSymbol yönteminden MethodInfo'yi edinme

örn. IMethodSymbol tanımlayan

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

2, bir [Int32] ile ilgili yöntemler, tek bir alma ve [Object], diğer alma [Int32] parametresi tür [eşittir] olduğu

Not '' eşittir.

Komut dosyalarını ayrıştırıyorum, herhangi bir çalışma alanı örneğim yok.

Herhangi bir fikrin var mı? Stevo

cevap

1

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.