أهلا،
عندما أستخدم المزج التلقائي لإنشاء Dictionary<T, U>
أحصل على القيم فيه بشكل افتراضي ، ولكن مع ConcurrentDictionary<T, U>
لا أفعل.
هل هذا عن طريق التصميم ويجب أن أستخدم منشئ عينات لتغيير هذا السلوك بنفسي ، أم أنها ميزة أو خطأ مفقود؟
إذا واجه أي شخص آخر نفس المشكلة ، فقد كتبت منشئ عينات لهذا:
public class ConcurrentDictionaryGenerator : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
Type type = request as Type;
if (type == null)
{
return new NoSpecimen();
}
Type[] typeArguments = type.GetTypeInfo().GetGenericArguments();
if (typeArguments.Length != 2 || typeof(ConcurrentDictionary<,>).MakeGenericType(typeArguments) != type)
{
return new NoSpecimen();
}
Type nonConcurrentDictionaryType = typeof(Dictionary<,>).MakeGenericType(typeArguments);
IDictionary nonConcurrentDictionary = (IDictionary) context.Resolve(nonConcurrentDictionaryType);
IDictionary concurrentDictionary = (IDictionary) Activator.CreateInstance(type);
foreach (object key in nonConcurrentDictionary.Keys)
{
object value = nonConcurrentDictionary[key];
concurrentDictionary.Add(key, value);
}
return concurrentDictionary;
}
}
أهلا،
لا يمكنني معرفة الأسباب الكامنة وراء ذلك ، ولكن بالنظر إلى الكود المصدري ، فإن المجموعات المدعومة مشفرة بشدة.
لذلك فهو ليس شيئًا مثل "هل اكتب تطبيق IDictionary" ، إنه "نوع قاموس <،>". لذلك لا يعمل ConcurrentDictionary.
لا تحتاج إلى إنشاء صانع العينات الخاص بك ، يمكنك استخدام ما هو موجود بالفعل:
var fixture = new Fixture();
var query = new ModestConstructorQuery();
var methodInvoker = new MethodInvoker(query);
var dictionaryFiller = new DictionaryFiller();
var postProcessor = new Postprocessor(methodInvoker, dictionaryFiller);
var exactTypeSpecification = new ExactTypeSpecification(typeof(ConcurrentDictionary<,>));
var specimenBuilder = new FilteringSpecimenBuilder(postProcessor, exactTypeSpecification);
fixture.Customizations.Add(specimenBuilder);
كلما تعلمت المزيد عن الأجزاء الداخلية لهذه المكتبة ، كلما أحببتها أكثر
من المثير للاهتمام معرفة أنه Dictionary<,>
فقط في الوقت الحالي وشكرًا للطريقة المضمنة في القيام بذلك!
أعتقد أن السؤال الوحيد المتبقي بالنسبة لشخص ما سيكون: هل ستكون هذه ميزة جيدة للإضافة؟ ربما ليس من أجل ConcurrentDictionary<,>
على وجه التحديد ، لكن كل تطبيقات IDictionary<,>
؟
فقط لأنني لا أنشر معلومات خاطئة ، فهي ليست مجرد قاموس <،>. أردت فقط أن أشير إلى أنه يمكن العثور على قائمة الأنواع مباشرة في Fixture.cs. على سبيل المثال ، يتم أيضًا فرزها
بكل الوسائل أود أن أقول أن التنفيذ المستقبلي يجب أن يتحقق من الواجهة.
في الواقع ، ما تم تشفيره ليس الدعم بل حقيقة أن الواجهات يتم نقلها إلى نوع ملموس. مثل ID Dictionary و IReadOnlyDictionary يتم ترحيلها إلى القاموس ، وهكذا.
التعليق الأكثر فائدة
أهلا،
لا يمكنني معرفة الأسباب الكامنة وراء ذلك ، ولكن بالنظر إلى الكود المصدري ، فإن المجموعات المدعومة مشفرة بشدة.
لذلك فهو ليس شيئًا مثل "هل اكتب تطبيق IDictionary" ، إنه "نوع قاموس <،>". لذلك لا يعمل ConcurrentDictionary.
لا تحتاج إلى إنشاء صانع العينات الخاص بك ، يمكنك استخدام ما هو موجود بالفعل: