سؤال

لديّ فئة A تنفذ iequatable <> ، باستخدام حقولها (على سبيل المثال ، AB و AC) لتنفيذ/تجاوز متساو () والتجاوز gethashcode () ، وكل شيء يعمل بشكل جيد ، 99 ٪ من الوقت. الفئة A هي جزء من التسلسل الهرمي (الفئة B ، ج) التي يرثها جميعها من الواجهة D ؛ يمكن تخزينها جميعًا معًا في قاموس قاموس ، وبالتالي فهي مريحة عندما يحملون جميعًا افتراضيًا خاصًا به ()/gethashcode ().

ومع ذلك ، أثناء بناء الذكاء الاصطناعي في وقت ما يحتاج إلى القيام ببعض الأعمال للحصول على قيم AB و AC ؛ أثناء حدوث ذلك ، أريد تخزين إشارة إلى المثيل الذي يتم بناؤه. في هذه الحالة ، لا أرغب في استخدام التجاوزات الافتراضية المتساوية ()/gethashcode () التي قدمها A. وبالتالي ، كنت أفكر في تنفيذ مسابقة مرجعية ، وهذا يهدف إلى إجبار استخدام الكائن المساواة ()/gethashcode () :

    private class ReferenceEqualityComparer<T> : IEqualityComparer<T>
    {
        #region IEqualityComparer<T> Members
        public bool Equals(T x, T y)
        {
            return System.Object.ReferenceEquals(x, y);
        }

        public int GetHashCode(T obj)
        {
            // what goes here? I want to do something like System.Object.GetHashCode(obj);
        }
        #endregion
    }

والسؤال هو ، نظرًا لأن object.gethashcode () ، كيف يمكنني (خارج أ) استدعاء كائن.

بالطبع ستكون إحدى الطرق بالنسبة إلى عدم تنفيذ iequatable <> ودائماً لتزويد iEqualityComparer <> بأي من القاموس الذي أقوم بإنشائه ، لكنني آمل الحصول على إجابة مختلفة.

شكرًا

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

المحلول

المباراة الطبيعية ل object.ReferenceEquals هو RuntimeHelpers.GetHashCode.

انظر إجابة هذا السؤال للحصول على التفاصيل الكاملة وتنفيذ ObjectReferenceEqualityComparer<T>: مدمج IEqualityComparer<T> الذي يستخدم ReferenceEquals

نصائح أخرى

استدعاء تطبيق قاعدة CLR عبر interop: التنفيذ الافتراضي للكائن

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