获取所有服务合同方法名称

时间:2016-06-08 11:56:25

标签: c# wpf wcf

从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”的错误。

2 个答案:

答案 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