سؤال

وStructureMap لا يحب تمر في أنواع nullable كوسائط المنشئ. هل هناك سبب لذلك؟ هل هناك طريقة للحصول على هذا العمل؟

[TestMethod]
public void Demo()
{
    ObjectFactory.Initialize(x => x.ForRequestedType<TestClass>()
                                    .TheDefault.Is.OfConcreteType<TestClass>()
                                    .WithCtorArg("param1").EqualTo((byte?)3));

//This fails, but works if it's non-nullable
    var result = ObjectFactory.GetInstance<TestClass>();
}

public class TestClass
{
    public TestClass(byte? param1)
    { }
}
هل كانت مفيدة؟

المحلول

والقضية الأساسية هي أن ليس هناك فرق، من وجهة نظر CLR، وبين محاصر (تحويلها إلى Object) مثلا من نوع قيم الفارغة، و(بدون علبة) مثيل من نوع مماثل غير قيم الفارغة. وبالمثل، عند استدعاء GetType () على نوع قيم الفارغة مثل int?، نوع عاد لا يمكن تمييزه من int العادية. انظر http://msdn.microsoft.com/en-us/library/ms366789 .aspx اتصال مزيد من المعلومات حول هذا الموضوع.

وهذا السلوك هو وصفة لكارثة لرمز مثل StructureMap التي يستجوب أنواع استخدام GetType () على معلمة كتبته كائن. منذ StructureMap لا أعرف ما إذا كان byte? الخاص بك هو قيم الفارغة في الواقع، عندما StructureMap رمز جينز الدعوة منشئ، ورمز جينز بأنها byte العادية، التي قنابل في وقت التشغيل منذ StructureMap يمر نوع الخطأ في دعوة منشئ.

وانها تريد ان يكون من الممكن لStructureMap كمحاولة للتغلب على هذه، ولكن التغييرات تكون غير تافهة. حاولت بضعة تعديلات على شفرة المصدر StructureMap (على سبيل المثال تغيير من استخدام كائن وGetType () بدلا من ذلك باستخدام طرق العامة التي قبلت نوع المعلمة عام، والتي يمكن بعد ذلك استجوابهم لمعرفة ما إذا كان نوع قيم الفارغة أم لا. ولكن هناك وقتل أكثر التغييرات المطلوبة (بما في ذلك، AFAIK، في الجيل IL المطلوبة لإجراء المكالمة منشئ) وذلك فاكتفيت.

وقد ترغب في تحقيق ذلك مع الفريق خريطة الهيكل نفسه الذي يعرف رمز أفضل. و StructureMap Google مجموعة مكان معقول للبدء. لاحظ أن سؤالك قد طلب قبل (انظر نهاية <لأ href = "http://groups.google.com/group/structuremap-users/browse_thread/thread/c3d83f27ee04d605/2fcaf37bd609d6ae؟hl=en&lnk=gst&q=nullable#2fcaf37bd609d6ae "يختلط =" نوفولو noreferrer "> هذا المنصب ) لذلك أنا غير متأكد من كيفية استجابة مجموعة غوغل.

ولكن، باستثناء إصلاح في StructureMap نفسه، إذا كنت أنت كنت تنظر التفاف صفك في مجمع بسيط الذي يزيل الحاجة إلى معلمة قيم الفارغة في منشئ.

وأما إذا كنت تشعر الشجعان، يمكنك محاولة إصلاح هذا عن طريق الحصول على جدا مألوفة مع شفرة المصدر StructureMap. : -)

وراجع للشغل، وهنا مثال واحد حيث تحدث المشكلة في مصدر StructureMap:

    /// <summary>
    /// Sets the value of the constructor argument
    /// </summary>
    /// <param name="propertyValue"></param>
    /// <returns></returns>
    public T EqualTo(object propertyValue)
    {
        if(propertyValue.GetType().IsSimple())
            _instance.SetProperty(_propertyName, propertyValue.ToString());
        else
        {
            _instance.SetChild(_propertyName,new LiteralInstance(propertyValue));
        }
        return (T) _instance;
    }

من خلال تحويل الحجة propertyValue إلى كائن، فإنه من المستحيل على طريقة لمعرفة ان كان نوع قيم الفارغة، منذ byte? وbyte لا يمكن تمييزها بمجرد تحويله إلى كائن.

نصائح أخرى

ولقد وجدت هذا الرمز في مصدر StructureMap. يبدو انها ليست بما في ذلك أنواع nullable.

protected internal bool IsSimple(Type type)
{
    return type.IsPrimitive || IsString(type) || IsEnum(type);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top