C# 如何从传递到泛型类的泛型接口获取方法?
下面是我的代码(可能实现不正确),我一直在尝试创建一种使用多个web服务的通用方法(以减少代码冗余)。到目前为止,在最后一行的“ClaimGetAsync()”之前,一切都很好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(
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
{
}