【问题标题】:Generic methods - Code Duplication泛型方法 - 代码重复
【发布时间】:2009-05-22 05:00:27
【问题描述】:

我无法掌握通用方法。

我有两个生成的类(它们完全相同,但我无法反应代码以使用相同的类对象)。

这里是类:

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

如何正确转换结果以便访问结果属性?

【问题讨论】:

  • 要掌握的是 C# 泛型不是 C++ 模板。泛型是真正的泛型;它们被设计成可以用任何类型参数化,以某些约束为模。你想要的东西只能用两种类型中的一种来构造;泛型不是为此而设计的。你发现自己的处境非常不幸。如果你可以让两个生成的类型实现一个通用接口,那么你的方法可以只引用一个实现该接口的东西。

标签: c# generics


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多