C# 通用方法-代码复制

C# 通用方法-代码复制,c#,generics,C#,Generics,我很难掌握通用方法 我有两个生成的类(它们完全相同,但我不能让代码使用相同的类对象) 以下是课程: public class1 : SoapHttpClientProtocol { public partial class notificationsResponse { private ResponseType[] responsesField; private bool ackField; /// <remarks/>

我很难掌握通用方法

我有两个生成的类(它们完全相同,但我不能让代码使用相同的类对象)

以下是课程:

public class1 : SoapHttpClientProtocol {
    public partial class notificationsResponse {

        private ResponseType[] responsesField;

        private bool ackField;

        /// <remarks/>
        public ResponseType[] Responses {
            get {
                return this.responsesField;
            }
            set {
                this.responsesField = value;
            }
        }

        /// <remarks/>
        public bool Ack {
            get {
                return this.ackField;
            }
            set {
                this.ackField = value;
            }
        }
    }
}

public class2 : SoapHttpClientProtocol {
    public partial class notificationsResponse {

        private ResponseType[] responsesField;

        private bool ackField;

        /// <remarks/>
        public ResponseType[] Responses {
            get {
                return this.responsesField;
            }
            set {
                this.responsesField = value;
            }
        }

        /// <remarks/>
        public bool Ack {
            get {
                return this.ackField;
            }
            set {
                this.ackField = value;
            }
        }
    }
}
public类1:SoapHttpClientProtocol{
公共部分类通知响应{
私有ResponseType[]responsesField;
私人布尔·阿克菲尔德;
/// 
公共响应类型[]响应{
得到{
返回此.responsesField;
}
设置{
this.responsesField=值;
}
}
/// 
公共图书馆{
得到{
返回this.ackField;
}
设置{
this.ackField=值;
}
}
}
}
公共类2:SoapHttpClientProtocol{
公共部分类通知响应{
私有ResponseType[]responsesField;
私人布尔·阿克菲尔德;
/// 
公共响应类型[]响应{
得到{
返回此.responsesField;
}
设置{
this.responsesField=值;
}
}
/// 
公共图书馆{
得到{
返回this.ackField;
}
设置{
this.ackField=值;
}
}
}
}
如你所见,class1和class2是相同的;因为它们是内联类,所以我必须有重复

除此之外,我尝试调用一个更新方法,并将以下类类型作为参数:

    private void UpdateMessageResponses<T>(T results)
    {
        T responses = (T)results;

        foreach (var accts in results.Responses)
        {
            int row = GetRowIdByAccountId(accts.ObjectId);
            if (row != -1)
            {
                TestResultsGrid["Status", row].Value = String.Format("{0} {1} - {2} - {3}", accts.ResponseDate, accts.ObjectType, accts.Message, accts.ObjectId);
            }
        }
    }
private void UpdateMessageResponses(T结果)
{
T反应=(T)结果;
foreach(results.Responses中的var账户)
{
int row=GetRowIdByAccountId(accts.ObjectId);
如果(行!=-1)
{
TestResultsGrid[“状态”,行].Value=String.Format(“{0}{1}-{2}-{3}”、accts.ResponseDate、accts.ObjectType、accts.Message、accts.ObjectId);
}
}
}

如何正确地强制转换结果,以便访问结果属性?

我可能错了,但我认为仅使用泛型无法做到这一点。唯一的方法是对泛型类型参数进行限制,但由于要访问的成员不是在两个类通用的基类中声明的,因此很遗憾,该选项被排除在外

我可能错了,但我不认为纯粹用泛型就可以做到这一点。唯一的方法是对泛型类型参数进行限制,但由于要访问的成员不是在两个类通用的基类中声明的,因此很遗憾,该选项被排除在外

您需要为Responses属性定义一个接口,然后指定T必须实现该接口(并且您的类确实实现了该接口)。

您需要为Responses属性定义一个接口,然后指定T必须实现该接口(并且您的类确实实现了该接口)

要理解的是C的泛型不是C++模板。仿制药是真正的仿制药;它们的设计使它们可以用任何类型参数化,以某些约束为模。你想要的东西只能用两种类型中的一种来构造;泛型并不是为了达到这个目的而设计的。你所处的处境非常不幸。如果你可以让这两种生成的类型实现一个公共接口,那么你的方法可以只需要一个REF来实现那个接口。要理解的是C泛型不是C++模板。仿制药是真正的仿制药;它们的设计使它们可以用任何类型参数化,以某些约束为模。你想要的东西只能用两种类型中的一种来构造;泛型并不是为了达到这个目的而设计的。你所处的处境非常不幸。如果您可以使生成的两个类型实现一个公共接口,那么您的方法就可以引用实现该接口的内容。