从WPF使用WCF服务,我想列出服务中的所有方法名称。
我尝试了两种解决方案, 1。
MethodInfo[] methods = typeof(TypeOfTheService).GetMethods();
foreach (var method in methods)
{
string methodName = method.Name;
}
它列出了所有函数,但它包含了一些其他函数,如“to string”,“open”,“abort”等。
2
MethodInfo[] methods = typeof(ITimeService).GetMethods();
foreach (var method in methods)
{
if (((System.Attribute)(method.GetCustomAttributes(true)[0])).TypeId.ToString() == "System.ServiceModel.OperationContractAttribute")
{
string methodName = method.Name;
}
}
最终显示“Index out of bound”的错误。
答案 0 :(得分:1)
第二种方法的问题是并非所有方法都具有OperationContract
属性。因此,对于这些方法,GetCustomAttributes
返回一个空数组。现在,当您尝试访问数组的第一个元素时,会出现此异常。
您可以简单地执行以下操作:
var attribute = method.GetCustomAttribute(typeof (OperationContractAttribute));
if(attribute != null)
{
//...
}
查看该方法是否具有OperationContract
属性。
如果您获得的是服务本身的类型,您可以获得它实现的所有接口,获取所有方法,然后检查这些方法是否具有OperationContract
属性,如下所示:
var methods =
typeof (TimeService).GetInterfaces()
.SelectMany(x => x.GetMethods())
.ToList();
foreach (var method in methods)
{
var attribute = method.GetCustomAttribute(typeof(OperationContractAttribute));
if (attribute != null)
{
//...
}
}
答案 1 :(得分:0)
您可以搜索服务合约中的方法,即界面,它不会包含ToString()
之类的任何方法:
var contractMethods = typeof(ITimeService).GetMethods(); // not TimeService