2012-06-06 31 views
5

İki benzer (aynı olmayan) dll var, bunlardan biri aslında diğerinin bir parçası. Hala uyumluluğun olup olmadığını görmeye çalışıyorum (yani, daha küçük olanı hala tamamen daha büyükse).System.Reflection - Bir MethodInfo nesnesinin Yöntem mi yoksa Özellik erişimcisi mi olduğunu nasıl anlarım?

Bunu, daha küçük dll'deki tüm türlerde yineleme yaparak ve bunların her birinde daha büyük dll'de (ad ve parametre listesi) bulunan yönteminin yönteminin var olup olmadığını kontrol ederek yapıyorum.

sorun Assembly.GetMethods() Ben, evet, tahmin yönteminin bir türüdür hem yöntem ve mülkiyet alıcılar/ayarlayıcılar, döndürdüğünü, ancak bu bu durum benim için kötü.

Yani, sorum, bir MethodInfo nesnesinin bir özelliği mi yoksa gerçek yöntemini mi sakladığını nasıl anlayabilirim?

+0

http://stackoverflow.com/questions/7819489/identify-whether-a-methodinfo-instance- bir dupe benziyor mülk-erişimci mi? – AakashM

+0

@AakashM: Gerçekten öyle görünüyor ki, maalesef bunu daha önce bulamadım ve biraz acelem vardı, bunu işaret ettiğin için teşekkürler. Böyle durumlarda yapmam gereken bir şey var mı? – nestedloop

cevap

11

Özellik erişimcileri, derleyici tarafından specialname olarak işaretlenmiştir. Bunu MethodInfo nesnesinde kontrol edebileceğiniz MethodBase.IsSpecialName ile kontrol edebilirsiniz. Bu özellik, operatör aşırı yükleri gibi diğer özel yöntemler için de geçerlidir.

bu sorgu olacağını mülkiyet Alıcılar ve ayarlayıcılar dışlamak için başka olasılık:

from m in typeof(SomeType).GetMethods() 
where !typeof(SomeType).GetProperties().Any(p => p.GetGetMethod() == m || p.GetSetMethod() == m) 
select m; 
+1

Evet, bu özellik erişimcileri algılar, ancak özellik erişimcileri Özel Ad olarak işaretlenen tek yöntem değildir, bu nedenle yanlış pozitif değerler verir. İkinci önerinizi çalışmak için – hvd

+0

+1, "GetGetMethod (nonPublic: true)" ifadesini kullanmayı düşünmekteyim ve benzer şekilde setter ve "GetMethods"/"GetProperties" ifadelerini çağırır. – hvd

+1

İlk çözümünüz benim için yeterince iyi çalışıyor, çünkü sadece "saf" yöntemlere ihtiyacım var, bu yüzden başka herşeyi hariç tutmam gerekiyor. Gerçekten çok teşekkür ederim efendim! : D – nestedloop

0

aşağıdakileri deneyin

methodInfo.IsDefined(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute), false); 
methodinfo.MemberType == MemberTypes.Property 
+0

Hızlı cevap için teşekkürler, maalesef bu işe yaramadı ... – nestedloop

+0

methodinfo.ReturnType Yardımcı? –

+1

@RajeshSubramanian Önerilerinizden biri neden yardım ister? Sadece rastgele tahmin ettiğini söylemiyorum, neden onları önerdiğinizi anlamıyorum. – hvd

0

Didnt'denemek ama bu yardımcı olacaktır: Bu konuda

var isMethod = (yourMethodInfo.MemberType & MemberTypes.Method) == MemberTypes.Method; 

Daha

: MemberTypes enumeration ve MethodInfo.MemberType property

+0

Hızlı cevap için teşekkürler. MemberTypes ile birkaç şey denedim ve hepsi methodInfo.MemberType == MemberTypes olarak görülüyor.Yöntem. Sanırım bu onların örtülü özellikleri oldukları için ... – nestedloop

2

Bir özellik erişimci bir olduğunu yöntem. Bir özellik get/set erişimcisi için syntactic shorthand'den başka bir şey değildir. C# farklı tanımlanmış olsaydı size MethodInfo size aradığınız cevabı söyleyemem görseniz dahi anlıyorsanız

class A 
{ 
    public int P { get { return 0; } } 
} 

class A 
{ 
    public int get_P() { return 0; } 
    public int P { get: get_P } 
} 

olarak, yazılmış olabilir. Bunun yerine, karşı yolu almalısınız: özellikleri (ve belki de olaylar da var) olup olmadığını görmek için bu yöntemi bir erişimci olarak kullanın. Type.GetProperties() ve basit bir foreach döngüsünü kullanabilirsiniz.

+0

Evet, bunu anladım. Bunu temizlediğiniz için teşekkürler. Dün Reflection ile başladım ve bugün bu yüzden çok acelem vardı. Şerefe. – nestedloop

İlgili konular