C# 尝试在构造函数中传递接口时,泛型类中出现错误

C# 尝试在构造函数中传递接口时,泛型类中出现错误,c#,generics,interface,C#,Generics,Interface,在这里,我有两个方法(共15个)调用soapweb服务 public async void CallWebServiceA() { var client = new WebServiceWRGClient(); var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport); binding.MaxReceivedMessageSize =

在这里,我有两个方法(共15个)调用soapweb服务

       public async void CallWebServiceA() {
            var client = new WebServiceWRGClient();
            var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
            binding.MaxReceivedMessageSize = Int32.MaxValue;
            binding.MaxBufferSize = Int32.MaxValue;
            var endpoint = new EndpointAddress("https://trustonline.delawarecpf.com/tows/webservicewrg.svc"); 
            var channelFactory = new ChannelFactory<WebServiceWRG>(binding, endpoint);
            var webService = channelFactory.CreateChannel();
            var user = new GRACE_GRACES.User();
            user.UserName = await webService.EncryptValueAsync("username");
            user.Password = await webService.EncryptValueAsync("password12345");
            var response = await client.ClaimSearchAsync(user, "", "", 12345, GRACE_GRACES.statuscode.NotSet, "");
       }

       public async void CallWebServiceB() {
            var client = new WebServiceAWIClient();
            var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
            binding.MaxReceivedMessageSize = Int32.MaxValue;
            binding.MaxBufferSize = Int32.MaxValue;
            var endpoint = new EndpointAddress("https://trustonline.delawarecpf.com/tows/webserviceawi.svc"); 
            var channelFactory = new ChannelFactory<WebServiceAWI>(binding, endpoint);
            var webService = channelFactory.CreateChannel();
            var user = new ARM_ARMS.User();
            user.UserName = await webService.EncryptValueAsync("username");
            user.Password = await webService.EncryptValueAsync("password12345");
            var response = await client.ClaimSearchAsync(user, "", "", 12345, ARM_ARMS.statuscode.NotSet, "");
       }
已更新 以下是我在下面尝试过但仍有错误的内容: user.UserName=webService.EncryptValue(用户名)//TTwo不包含“用户名”的def,T不包含加密值的def

   public class Test {
        public void TestWebService() {
            var ws = new WebService<WebServiceWRG>();
            ws.SearchClaim(new WebServiceWRGClient(), new GraceUser(), "url", "userName", "password");
        }
    }

    public class WebService<T> { 
        public void SearchClaim<TOne, TTwo>(TOne entity1, TTwo entity2, string url, string userName, string password) 
            where TOne : class
            where TTwo : class
        {
            var client = entity1;
            var binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
            var endpoint = new EndpointAddress(url);
            var channelFactory = new ChannelFactory<T>(binding, endpoint);
            var webService = channelFactory.CreateChannel();
            var user = entity2;
            user.UserName = webService.EncryptValue(userName); // username not found, encryptvalue not found
            user.Password = webService.EncryptValue(password); // passwordnot found, encryptvalue not found
            var response = client.ClaimSearch(user, "", "", 12345, GraceStatuscode.NotSet, ""); // claimsearch not found
        }
    }
公共类测试{
公共void TestWebService(){
var ws=newwebservice();
SearchClaim(新的WebServiceWRGClient(),新的GraceUser(),“url”,“用户名”,“密码”);
}
}
公共类Web服务{
public void SearchClaim(音调entity1、TTwo entity2、字符串url、字符串用户名、字符串密码)
where音调:class
其中TTwo:类
{
var client=entity1;
var binding=新的BasicHttpBinding(BasicHttpSecurityMode.Transport);
var endpoint=新的端点地址(url);
var channelFactory=新的channelFactory(绑定,端点);
var webService=channelFactory.CreateChannel();
var user=entity2;
user.UserName=webService.EncryptValue(UserName);//找不到用户名,找不到EncryptValue
user.Password=webService.EncryptValue(Password);//找不到Password,找不到EncryptValue
var response=client.ClaimSearch(用户,“,”,12345,GraceStatuscode.NotSet,”;//找不到ClaimSearch
}
}
首先,让我们确认您所做的更改是正确的更改。避免代码重复非常重要,可以显著提高代码质量。干得好

这可能是朝着正确方向迈出的一步:

public class WebService<T1, T2, T3> {
    private T1 _client;
    private T3 _user;

    //No T2

    public WebService(T1 wsClient, T3 wsUser) {
        _client = wsClient;
        _user = wsUser;
        //No interface
    }

    public void CallWebService(string url, string userName, string password) {
        (...)
        var channelFactory = new ChannelFactory<T2>(binding, endpoint);   <---- use the T2 type
        (...)
    }
}
然后

var someServiceA = new WebService<WebServiceWRGClient, WebServiceWRG, Whatever_GRACE_GRACES_User()_returns_here>(new WebServiceWRGClient(), new GRACE_GRACES.User());
var someServiceA = new WebService<WebServiceWRG>(new WebServiceWRGClient(), new GRACE_GRACES.User());
var someServiceB = new WebService<WebServiceAWI>(new WebServiceAWIClient(), new ARM_ARMS.User());
var someServiceA=newwebservice(newwebservicewrgclient(),newgrace_GRACES.User());
var someServiceB=newwebservice(newwebserviceawiclient(),newarm_ARMS.User());

这不是泛型的问题,而是调用
WebService的构造函数的方式的问题。
WebService
的构造函数需要三个参数。通过
new
关键字创建的对象传递第一个和第三个参数值。第二个参数是您希望作为接口名传递的。这就是它不起作用的原因。您需要传递实现接口
WebServiceWRG
和/或
WebServiceWRG
的类的对象。使用的语法不正确。目前的问题也不完整,因此不清楚。这可能是一个错误。你能提供一个例子吗?@user1186050这段代码有很多语法问题,但是如果没有你的指导,你实际上想做什么,就没有什么帮助了。我正在将数据发送到一个在线服务/web服务(我更新了文章顶部的代码)来展示这个方法。但我有大约15个不同的url,每个url/web服务都有自己的引用,这些引用是由.net生成的。因此,每次从web服务调用“ClaimSearch()”时,我都必须使用不同的客户机、接口和用户构造参数。其中每一个都来自不同的服务引用。嗨,Tymtam。我想我不理解你对“UserTypeHere”的用法,你能解释一下这是什么,以及它如何与示例一起工作吗?Tymtam,我的每个用户()来自每个不同的web服务引用。我尝试了您的第一个示例,但它不起作用,因为该类仍然需要3个参数,而现在您只需要传递2 what class
.User()
return for GRACE and ARM?嗨,Tymtam。返回的User()类是命名空间中的一部分类,该命名空间是从每个特定Web服务创建的。所以我引用名称空间如下:使用GRACE_GRACE;然后创建如下别名:使用GraceUser=GRACE\u GRACES.User;然后我将这样使用它:var user=newgrace_GRACES.user();
var someServiceA = new WebService<WebServiceWRGClient, WebServiceWRG, Whatever_GRACE_GRACES_User()_returns_here>(new WebServiceWRGClient(), new GRACE_GRACES.User());
public class WebService<T> {
    private Baseclassofallclients _client;
    private UserTypeHere _user;


    public WebService( Baseclassofallclients wsClient, UserTypeHere  wsUser) {
        _client = wsClient;
        _user = wsUser;
        //No interface
    }

    public void CallWebService(string url, string userName, string password) {
        (...)
        var channelFactory = new ChannelFactory<T>(binding, endpoint);   <---- use the T type here
        (...)
    }
var someServiceA = new WebService<WebServiceWRG>(new WebServiceWRGClient(), new GRACE_GRACES.User());
var someServiceB = new WebService<WebServiceAWI>(new WebServiceAWIClient(), new ARM_ARMS.User());