C# 如何从传递到泛型类的泛型接口获取方法?

C# 如何从传递到泛型类的泛型接口获取方法?,c#,web-services,wcf,generics,C#,Web Services,Wcf,Generics,下面是我的代码(可能实现不正确),我一直在尝试创建一种使用多个web服务的通用方法(以减少代码冗余)。到目前为止,在最后一行的“ClaimGetAsync()”之前,一切都很好 public static class Test { public static void TestWebServiceA() { var ws = new WebService<ARMDevelopment.WebServiceAWI>(); ws.GetClaim(

下面是我的代码(可能实现不正确),我一直在尝试创建一种使用多个web服务的通用方法(以减少代码冗余)。到目前为止,在最后一行的“ClaimGetAsync()”之前,一切都很好

public static class Test {
    public static void TestWebServiceA() {
        var ws = new WebService<ARMDevelopment.WebServiceAWI>();
        ws.GetClaim(new ARMDevelopment.WebServiceAWIClient(), new ARMDevelopment.User(), 
            "https://trustonline.delawarecpf.com/tows/webserviceawi.svc", "userName", "password");  
    }
     public static void TestWebServiceB() {
        var ws = new WebService<BWDevelopment.WebServiceBW>();
        ws.GetClaim(new BWDevelopment.WebServiceBWClient(), new BWDevelopment.User(), 
            "https://trustonline.delawarecpf.com/tows/webservicebw.svc", "userName", "password");  
    }
}
public class WebService<T> {             
    public async void GetClaim<TOne, TTwo>(TOne entity1, TTwo entity2, string url, string userName, string password) 
        where TOne : IWebServiceClient, new() // class, new()
        where TTwo : IUser, new()  // limits the TTwo class to implement IUser -> IUser created by me   
    {
        TOne webServiceClient = new TOne(); // entity1;
        BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
        EndpointAddress endpoint = new EndpointAddress(url);
        ChannelFactory<T> channelFactory = new ChannelFactory<T>(binding, endpoint);

        TTwo user = new TTwo(); // entity2;
        user.UserName = await entity1.EncryptValueAsync(userName);
        user.Password = await entity1.EncryptValueAsync(password);

        T wcfClient = channelFactory.CreateChannel();
        var response = wcfClient.ClaimGetAsync(user, 12345); 
    }
}
如何获得查找/发现ClaimGetAsync()的泛型,以便使用它

更新-一位成员要求我发布从web服务util svcuti.exe生成的一些接口代码: 这里有一个来自AWI web服务,我还有20多个来自我们从该提供商使用的所有其他服务

namespace WebServices_Development_TrustOnline_ARM
{
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
  [System.ServiceModel.ServiceContractAttribute(Namespace="urn:trustonline", ConfigurationName="WebServices_Development_TrustOnline_ARM.WebServiceAWI")]
    public interface WebServiceAWI
    {
       [System.ServiceModel.OperationContractAttribute(Action="urn:trustonline/EncryptValue", ReplyAction="urn:trustonline/EncryptValue")]
      [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
      System.Threading.Tasks.Task<string> EncryptValueAsync(string text);
    }

   [System.ServiceModel.OperationContractAttribute(Action="urn:trustonline/ClaimGet", ReplyAction="urn:trustonline/ClaimGet")]
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="webserviceresult")]
    System.Threading.Tasks.Task<WebServices_Development_TrustOnline_ARM.WebServiceResult> ClaimGetAsync(WebServices_Development_TrustOnline_ARM.User user, int claimnumber);

}
名称空间Web服务\u开发\u在线信任\u ARM
{
[System.CodeDom.Compiler.GeneratedCodeAttribute(“Microsoft.Tools.ServiceModel.Svcutil”,“2.0.1”)]
[System.ServiceModel.ServiceContractAttribute(Namespace=“urn:trustonline”,ConfigurationName=“WebServices\u Development\u trustonline\u ARM.webserviceCawi”)]
公共接口WebServiceAWI
{
[System.ServiceModel.OperationContractAttribute(Action=“urn:trustonline/EncryptValue”,ReplyAction=“urn:trustonline/EncryptValue”)]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
System.Threading.Tasks.Task EncryptValueAsync(字符串文本);
}
[System.ServiceModel.OperationContractAttribute(Action=“urn:trustonline/ClaimGet”,ReplyAction=“urn:trustonline/ClaimGet”)]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
[返回:System.ServiceModel.MessageParameterAttribute(Name=“webserviceresult”)]
System.Threading.Tasks.Task ClaimGetAsync(WebServices\u Development\u TrustOnline\u ARM.User用户,int-claimnumber);
}
公共接口ICLAIMService
{
任务ClaimGetAsync(TUser用户,int claimsNumber);
}
公共类Web服务,其中T:ICLAIMSERVICE
{
}
公共接口ICLAIMService
{
任务ClaimGetAsync(TUser用户,int claimsNumber);
}
公共类Web服务,其中T:ICLAIMSERVICE
{
}

用户不是我创建的某个对象,它对于每个web服务都是特定和唯一的。所以它可能类似于namespaceA.webserviceca.User,namespaceB.webserviceceb.User。因此,我可以像您的示例中那样传入任何用户。此外,生成的每个webservice代理代码文件都有一个用于ClaimGetAsync的接口。例如System.Threading.Tasks.Task ClaimGetAsync(WebServices\u Development\u TrustOnline\u ARM.User用户,int-claimnumber);请注意,传入的内容和返回的内容对于每个服务都是非常特定的。我刚刚尝试了您的解决方案,但我认为您的解决方案不起作用,因为我必须将每个web服务的特定接口(例如ARMDevelopment.WebServiceAWI)传递给构造函数。因此,当我尝试使用它时,构造函数有一条红线:“类型'WebServices\u Development\u TrustOnline\u ARM.webservicecawi'不能用作泛型类型或方法'WebService'中的类型参数'T'。没有从'WebServices\u Development\u TrustOnline\u ARM.webservicecawi'到'Auto2.API.Helpers.IWebServiceClient'的隐式引用转换。”用户不是我创建的某个对象,它对于每个web服务都是特定和唯一的。所以它可能类似于namespaceA.webserviceca.User,namespaceB.webserviceceb.User。因此,我可以像您的示例中那样传入任何用户。此外,生成的每个webservice代理代码文件都有一个用于ClaimGetAsync的接口。例如System.Threading.Tasks.Task ClaimGetAsync(WebServices\u Development\u TrustOnline\u ARM.User用户,int-claimnumber);请注意,传入的内容和返回的内容对于每个服务都是非常特定的。我刚刚尝试了您的解决方案,但我认为您的解决方案不起作用,因为我必须将每个web服务的特定接口(例如ARMDevelopment.WebServiceAWI)传递给构造函数。因此,当我尝试使用它时,构造函数有一条红线:“类型'WebServices\u Development\u TrustOnline\u ARM.webservicecawi'不能用作泛型类型或方法'WebService'中的类型参数'T'。没有从'WebServices\u Development\u TrustOnline\u ARM.webservicecawi'到'Auto2.API.Helpers.IWebServiceClient'的隐式引用转换。”您希望
T
是什么类型?能否在
T
上添加泛型类型约束?T是从web服务util生成的特定接口。如果你看我的代码。您将看到ARMDevelopment.WebServiceAWI作为T传递。这是一个包含GetClaim()、SearchClaim()、AddClaim()等方法的接口。对于我们调用的20多个web服务中的每一个,都有一个不同的接口。这些类是否共享包含该方法的公共接口?是,ARMDevelopment.WebServiceAWI是共享这些方法的公共接口。但是,20多个web服务中的每一个都有一个通用接口。因此,我有例如.ARMDevelopment.webservicecawi、BWDevelopment.WebServiceBW、CJDevelopment.WebServiceCJ等所有这些接口都有相同的方法,例如GetClaim()、SearchClaim()、AddClaim(),等等。如果它们都实现了
ARMDevelopment.webservicecawi
,并且该接口包含所需的方法,那么
T:ARMDevelopment.webservicecawi
应该是您的类型约束。您希望
T
是什么类型?能否在
T
上添加泛型类型约束?T是从web服务util生成的特定接口。如果你看我的代码。您将看到ARMDevelopment.WebServiceAWI作为T传递。这是一个包含GetClaim()、SearchClaim()、AddClaim()等方法的接口。对于我们调用的20多个web服务中的每一个,都有一个不同的接口。这些类是否共享包含该方法的公共接口?是,ARMDevelopment.WebServiceAWI是共享这些方法的公共接口。但是,20多个web服务中的每一个都有一个通用接口。因此,我有例如ARMDevelopment.webservicecawi、BWDevelopment.WebServiceBW、CJDevelopment.WebServiceCJ等所有这些接口都有相同的方法,例如Ge
var response = wcfClient.ClaimGetAsync(user, 12345);
namespace WebServices_Development_TrustOnline_ARM
{
    [System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Tools.ServiceModel.Svcutil", "2.0.1")]
  [System.ServiceModel.ServiceContractAttribute(Namespace="urn:trustonline", ConfigurationName="WebServices_Development_TrustOnline_ARM.WebServiceAWI")]
    public interface WebServiceAWI
    {
       [System.ServiceModel.OperationContractAttribute(Action="urn:trustonline/EncryptValue", ReplyAction="urn:trustonline/EncryptValue")]
      [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
      System.Threading.Tasks.Task<string> EncryptValueAsync(string text);
    }

   [System.ServiceModel.OperationContractAttribute(Action="urn:trustonline/ClaimGet", ReplyAction="urn:trustonline/ClaimGet")]
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="webserviceresult")]
    System.Threading.Tasks.Task<WebServices_Development_TrustOnline_ARM.WebServiceResult> ClaimGetAsync(WebServices_Development_TrustOnline_ARM.User user, int claimnumber);

}
public interface IClaimsService
{
    Task<IEnumerable<Claim>> ClaimGetAsync<TUser>(TUser user, int claimsNumber);
}

public class WebService<T> where T : IClaimsService
{

}