通用方法 - 代码复制

时间:2009-05-21 20:51:49

标签: c# generics

我在掌握通用方法时遇到了麻烦。

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

这是课程:

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;
            }
        }
    }
}

你可以看到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);
            }
        }
    }

如何正确地投射结果以便我可以访问结果属性?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我可能错了,但我不认为你可以纯粹用泛型来做。唯一的方法是对泛型类型参数进行限制,但由于您要访问的成员未在基类中声明,这对于您的两个类是常见的,因此很遗憾。