nan*_*nan 6 .net c# reflection properties interface
我想使用反射来显示接口中的方法列表.
public interface IRoadVehicle
{
int WheelCount { get; }
bool IsEmergency();
}
Run Code Online (Sandbox Code Playgroud)
我使用以下代码:
foreach (var m in typeof(IRoadVehicle).GetMethods())
{
Console.WriteLine(m.Name);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果接口具有属性,我还会列出编译器生成的属性访问器.我想区分显式定义的方法和属性访问器以省略后者.
//output:
//get_WheelCount
//IsEmergency
//desired output:
//IsEmergency
Run Code Online (Sandbox Code Playgroud)
如何过滤掉与属性相关的方法?
Dan*_*rth 18
您可以使用该IsSpecialName属性:
foreach (var m in typeof(IRoadVehicle).GetMethods().Where(x => !x.IsSpecialName))
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
这将删除具有名称的所有方法,该名称由编译器以某种方式处理.文档说明了这一点:
SpecialName位设置为标记某些编译器以特殊方式处理的成员(例如属性访问器和运算符重载方法).
怎么样:
var type = typeof(IRoadVehicle);
var accessors = type.GetProperties().SelectMany(property => property.GetAccessors());
var methods = type.GetMethods()
.Except(accessors);
Run Code Online (Sandbox Code Playgroud)
您也可以IsSpecialName像Daniel Hilgarth所提到的那样使用,但请注意,这也将排除其他"特殊"方法,如运算符(不是接口问题)和事件访问器.真的,取决于你想要的东西.