2012-11-16 32 views
0

當我呼叫inter.GetMethods()時,它給出了我所有的get和set語句的方法列表,包括。我如何檢查每個項目(在foreach中)是否爲get或set語句。Interface.GetMethods()在c#中包含get和set語句

foreach (MethodInfo meth in inter.GetMethods()) Console.WriteLine(meth.Name); 
+0

是沒可能使用['的getMethods(*超載*)'](http://msdn.microsoft.com/ en-us/library/4d848zkb.aspx),它需要'BindingFlags'並從頭開始排除屬性? – 2012-11-16 02:07:18

+0

你能展示你的代碼嗎? –

+0

有我的代碼。你能告訴我如何? –

回答

2

不完全是最優雅的,但它的工作原理:

List<MethodInfo> propertyGetterSetters = new List<MethodInfo>(); 
foreach(PropertyInfo prop in typeof(MyType).GetProperties()) 
{ 
    var getter = prop.GetGetMethod(); 
    var setter = prop.GetSetMethod(); 

    if (getter != null) 
     propertyGetterSetters.Add(getter); 

    if (setter != null) 
     propertyGetterSetters.Add(setter); 
} 


List<MethodInfo> nonPropertyMethods = typeof(MyType).GetMethods().Except(propertyGetterSetters).ToList(); 

你也可以使用MethodInfo.IsSpecialName,但也可以拿起的不僅僅是性能以外的其他特殊情況,但如果你有一個簡單的類,你可以測試並看到它的工作原理,你可以用它來代替。我不會推薦它;我寧願只使用一個工具方法像我上面:

var nonPropertyMethods = typeof(MyType).GetMethods().Where(m => !m.IsSpecialName);

+0

謝謝,這很好。我最終做的是檢查他們的姓名開頭是否有'get_'或'set_'。我知道這不會失明。 –

+1

@ArlenBeiler我不會那樣做;似乎太脆弱了。一方面,你可以合法地將一個非屬性方法加上「get _....」。另一方面,我可能錯了,編譯的名稱可能無法保證.NET/mono的不同實現或未來的版本。但是,如果它適合你,去爲它! –