سؤال

لدي قائمة أملأها في جانب الخادم. إنها قائمة "المستخدم" ، والتي تنفذ icomparable. الآن عندما تقوم WCF بتسلسل البيانات ، أعتقد أنها لا تشمل طريقة المقارنة. هذا هو فئة الكائن الخاصة بي:

[DataContract]
public class User : IComparable
{
    private string e164, cn, h323;
    private int id;
    private DateTime lastActive;

    [DataMember]
    public DateTime LastActive
    {
        get { return lastActive; }
        set { laatstActief = value; }
    }
    [DataMember]
    public int Id
    {
        get { return id; }
        set { id = value; }
    }
    [DataMember]
    public string H323
    {
        get { return h323; }
        set { h323 = value; }
    }
    [DataMember]
    public string Cn
    {
        get { return cn; }
        set { cn = value; }
    }
    [DataMember]
    public string E164
    {
        get { return e164; }
        set { e164 = value; }
    }

    public User()
    {

    }

    public User(string e164, string cn, string h323, DateTime lastActive)
    {
        this.E164 = e164;
        this.Cn = cn;
        this.H323 = h323;
        this.LastActive= lastActive;
    }
    [DataMember]
    public string ToStringExtra
    {
        get
        {
            if (h323 != "/" && h323 != "")
                return h323 + " (" + e164 + ")";
            return e164;
        }
        set { ;}
    }

    public override string ToString()
    {
        if (Cn.Equals("Trunk Line") || Cn.Equals(""))
            if (h323.Equals(""))
                return E164;
            else
                return h323;
        return Cn;
    }

    public int CompareTo(object obj)
    {
        User user = (User)obj;
        return user.LastActive.CompareTo(this.LastActive);
    }
}

هل من الممكن الحصول على طريقة المقارنة للوصول إلى العميل؟ وضع [Datamember] ليس هو الحل كما جربته (أعرف ...).

شكرا مقدما.

هل كانت مفيدة؟

المحلول

لا تحتاج إلى تنفيذ مماثلة.

يمكنك استخدام المندوبين لفرز القائمة أيضًا ، بدون icomparable في الفصل. حاول التالية الكود.

users.Sort(delegate(User u1, User u2) { return u1.LastActive.CompareTo(u2.LastActive); });

يمكنك استخدام هذا مباشرة في عميلك.

نصائح أخرى

لا ، المقارنة هي طريقة وليس عضوًا.

إذا كنت ترغب في تكرار ذلك على جانب العميل ، فإما توفير مكتبة جانبية للعميل تتكيف مع كائن العميل وكذلك تنفذ icomparable.

@frogbot لديه اقتراح صحيح ، لكن تمرير الكائنات هو ضد الطبيعة الحقيقية لـ SOA ، والهدف هو التحدث عن واجهات وهذا هو السبب في أنها جعلت من الصعب استخدام NetDatacontractSerializer.

الواجهات (الكود) ليست متسلسلة. قد تفكر في التحول إلى NetDataContractSerializer. في هذه الحالة ، سيتم تضمين معلومات النوع في الدفق ويمكنك الحصول على نفس الكائن على العميل (إذا كان التجميع الذي يحتوي على النوع موجودًا AppDomain).

نظرًا لأن العميل والخادم الخاص بك يتحدثان عن نفس مكدس التكنولوجيا (أي كلاهما يستخدم .NET) ، اطلب من مرجع رمز جانبي العميل الخاص بك نفس تجميع (كائن البيانات الذي يحتوي على) كما يستخدم الخادم*. بعد ذلك ، ستكون تطبيقات الواجهة الخاصة بك سليمة ، حيث ستستخدم كلتا التجميعات نفس تعريفات كائن البيانات ، بدلاً من الخادم باستخدام التعريف العادي والعميل باستخدام التعريف الذي يتم إنشاؤه كجزء من الوكيل.

مشاركة أو "إعادة استخدام" هذه التجميعات هو موضوع تم تغطيته جيدًا.

*هذا يعني أن كائنات البيانات الخاصة بك مثل المستعمل موجودة في مجموعة منفصلة ، هذه هي المهمة الوحيدة لتلك التجميع. ثم يمكن لكل من العميل والخادم الخاص بك (WebService) الرجوع إليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top