سؤال

انا املك Dictionary(TKey, TValue) مثل

Dictionary<int, ArrayList> Deduction_Employees = 
    new Dictionary<int, ArrayList>();

وبعد ذلك أضف إلى قائمة الصفيف هذه نوعًا مجهولًا مثل هذا

var day_and_type = new {
    TheDay = myDay,
    EntranceOrExit = isEntranceDelay
};

Deduction_Employees[Employee_ID].Add(day_and_type);

الآن كيف يمكنني إلغاء صندوق VAR والوصول إلى تلك الخصائص ؟؟

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

المحلول

أولاً ، أنت لا تفصل النوع. أنواع مجهولة هي أنواع مرجعية ، وليس الهياكل.

على الرغم من أنه يمكنك من الناحية الفنية إنشاء مثيلات من نفس النوع خارج الطريقة التي تم الإعلان عنها (كما في القسم 7.5.10.6 من مواصفات لغة C# 3.0 ، والتي تنص على:

ضمن نفس البرنامج ، فإن اثنين من الكائنات المجهولة التي تحدد تسلسل خصائص من نفس الأسماء وأنواع وقت الترجمة في نفس الترتيب سوف تنتج مثيلات من نفس النوع المجهول.

) ليس لديك طريقة للحصول على اسم من النوع الذي تحتاجه من أجل أداء الممثلين من Object العودة إلى النوع الذي أنشأته. سيكون عليك اللجوء إلى حل ملقم على سبيل المثال وهو معيب بطبيعته.

مثال على سبيل المثال معيب لأنه من وجهة نظر التصميم ، كل مكان تريد الوصول إليه خارج الوظيفة التي يتم إعلانها (وما زالت داخل الوحدة نفسها) ، يجب عليك إعلان النوع بشكل فعال مرة أخرى.

إنه ازدواج في الجهد يؤدي إلى تصميم وتنفيذ قذرة.

إذا كنت تستخدم .NET 4.0 ، فأنت أنت يستطع ضع مثيل الكائن في متغير ديناميكي. ومع ذلك ، فإن العيب الرئيسي هو عدم التحقق من وقت الترجمة من وصول الأعضاء. يمكنك بسهولة إلقاء الضوء على اسم العضو ، ثم لديك خطأ في وقت التشغيل بدلاً من خطأ في وقت الترجمة.

أخيرًا، إذا وجدت الحاجة إلى استخدام نوع مجهول خارج الطريقة التي يتم الإعلان عنها ، فإن الحل الجيد الوحيد هو إنشاء نوع ملموس واستبدل النوع المجهول لنوع الخرسانة.

نصائح أخرى

هناك عدة طرق.

نظرًا لأن التعليقات يبدو أنها تشير إلى أنني أقترح عليك القيام بذلك ، اسمحوا لي أن أوضح: يجب أن تقوم بإنشاء نوع مسمى لكائنك لأنك تنوي تمريره.

أولاً ، يمكنك استخدام التفكير ، وهو ما أشار إليه إجابة أخرى هنا.

طريقة أخرى ، والتي تحيل .net في إعطائك النوع الصحيح تُعرف باسم "المصبوب بالمثال" ، وهو ما يسير على هذا النحو: تحتاج إلى تمرير كائنك من خلال استدعاء طريقة عامة ، والتي ستعيد الكائن كنوع صحيح ، عن طريق استنتاج النوع الصحيح للعودة.

على سبيل المثال ، جرب هذا:

private static T CastByExample<T>(T example, object value)
{
    return (T)value;
}

واستخدامه:

var x = CastByExample(new { TheDay = ??, EntranceOrExit = ?? }, obj);

ل اثنين ؟؟ البقع ، تحتاج فقط إلى تمرير شيء مناسب لنوع البيانات لتلك الخصائص ، ولن يتم استخدام القيم.

يستغل هذا حقيقة أن أنواعًا مجهولة المصدر التي تحتوي على نفس الخصائص الدقيقة ، من نفس النوع ، في نفس الترتيب ، في نفس المجموعة ، سوف تقوم بتخطيط لنفس النوع الفردي.

ومع ذلك ، بحلول هذا الوقت يجب أن تقوم بإنشاء نوع مسمى بدلاً من ذلك.

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

مصدر: http://msdn.microsoft.com/en-us/library/bb397696.aspx

لا لا يمكنك. يمكنك فقط الوصول إلى الخصائص باستخدام الانعكاس. ليس لدى المترجم أي طريقة لمعرفة ما هو النوع ، وبما أنه نوع مجهول ، فلا يمكنك إلقاءه أيضًا.

إذا كنت تستخدم .NET 1.x - 3.x ، فيجب عليك استخدام الانعكاس.

إذا كنت تستخدم .NET 4.0 ، يمكنك استخدام نوع ديناميكي واستدعاء الخصائص المتوقعة.

في كلتا الحالتين ، لا تحتاج إلى إلغاء الابتكار ؛ هذا لأنواع القيمة. أنواع مجهولة هي دائما أنواع مرجعية.

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