[c#] إنشاء سريع للكائنات بدلاً من Activator.CreateInstance (نوع)



Answers

قد يساعد هذا: لا تستخدم Activator.CreateInstance أو ConstructorInfo.Invoke ، استخدم تعبيرات lambda المترجمة :

// Make a NewExpression that calls the ctor with the args we just created
NewExpression newExp = Expression.New(ctor, argsExp);                  

// Create a lambda with the New expression as body and our param object[] as arg
LambdaExpression lambda = Expression.Lambda(typeof(ObjectActivator), newExp, param);            


// Compile it
ObjectActivator compiled = (ObjectActivator)lambda.Compile();
Question

أحاول تحسين أداء طلبنا. لدينا الكثير من المكالمات Activator.CreateInstance التي تسبب بعض الحزن.

نحن نجعل الكثير من الطبقات تقوم على واجهة (ITabDocument) وبعد النظر حولي ، فكرت في استخدام هذا الكود:

الرمز ليس أفضل (أبطأ هامشيا أبطأ) من استخدام رمز Activator.CreateInstance كان لدينا.

    public static Func<T> CreateInstance<T>(Type objType) where T : class, new()
    {
        var dynMethod = new DynamicMethod("DM$OBJ_FACTORY_" + objType.Name, objType, null, objType);
        ILGenerator ilGen = dynMethod.GetILGenerator();
        ilGen.Emit(OpCodes.Newobj, objType.GetConstructor(Type.EmptyTypes));
        ilGen.Emit(OpCodes.Ret);
        return (Func<T>)dynMethod.CreateDelegate(typeof(Func<T>));
    }

أنا أتساءل لماذا هذا ، كل ما أفعله هو:

ITabDocument document = CreateInstance<ITabDocument>(Type.GetType("[Company].Something"));

هل هناك طريقة أفضل لإنشاء الأشياء التي من شأنها أن تساعد في ما سبق؟ من الصعب قليلا عندما كنت غير متأكد من نوع ملموسة.




ربما كنت تحصل على بعض النفقات العامة من جيل من نفس الرمز.

يقوم ILGenerator بإنشاء كود ILGenerator بشكل ديناميكي.

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




Related