كيفية استخدام object.gethashcode () على نوع يتجاوز gethashcode ()
-
22-09-2019 - |
سؤال
لديّ فئة 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: التنفيذ الافتراضي للكائن