سؤال

لقد طُلب مني استخدام Reflection.Emit بدلاً من PropertyInfo.GetValue / SetValue لأنه أسرع بهذه الطريقة.لكنني لا أعرف حقًا ما هي الأشياء الموجودة في Reflection.Emit وكيفية استخدامها لاستبدال GetValue وSetValue.أي شخص يمكن أن تساعدني في هذا ؟

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

المحلول

وفقط جوابا البديلة؛ إذا كنت ترغب في الأداء، ولكن API مماثل - النظر HyperDescriptor . هذا يستخدم Reflection.Emit تحت (لذلك لم يكن لديك ل)، ولكن يعرض نفسه على API PropertyDescriptor، بحيث يمكنك استخدام فقط:

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj);
props["Name"].SetValue(obj, "Fred");
DateTime dob = (DateTime)props["DateOfBirth"].GetValue(obj);

وخط واحد من التعليمات البرمجية لتمكينه، وأنه يتعامل مع كافة التخزين المؤقت وغيرها.

نصائح أخرى

إذا كنت تقوم بإحضار/تعيين نفس الخاصية عدة مرات، فإن استخدام شيء ما لإنشاء طريقة آمنة للكتابة سيكون بالفعل أسرع من الانعكاس.ومع ذلك، أود أن أقترح استخدام Delegate.CreateDelegate بدلاً من الانعكاس. انبعاث.من الأسهل القيام بالأمر الصحيح، ولا يزال سريعًا للغاية.

لقد استخدمت هذا في تطبيق Protocol Buffers الخاص بي وقد أحدث فرقًا كبيرًا مقارنة بـ Protocol Buffers PropertyInfo.GetValue/SetValue.وكما قال الآخرون، لا تفعل ذلك إلا بعد إثبات أن أبسط طريقة بطيئة جدًا.

انا املك مشاركة مدونة مع مزيد من التفاصيل إذا قررت النزول CreateDelegate طريق.

استخدم PropertyInfo.GetValue / SetValue

إذا كان لديك مشاكل أداء ذاكرة التخزين المؤقت الكائن PropertyInfo (لا ندعو مرارا GetProperty)

إذا - وفقط إذا - استخدام التفكير هو عنق الزجاجة أداء التطبيق (كما رأينا في التعريف) استخدام Delegate.CreateDelegate

إذا - وحقا حقا إلا إذا - كنت متأكدا تماما من أن قراءة / كتابة القيم لا يزال أسوأ عنق الزجاجة حان الوقت للبدء في تعلم حول العالم متعة لتوليد IL في وقت التشغيل

وأشك حقا انه يستحق ذلك، كل من هذه المستويات زيادة تعقيد رمز أكثر بعد ذلك تحسين الأداء - القيام بها إلا إذا كان لديك

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

والغرض من Reflection.Emit مختلفة تماما عن تلك التي PropertyInfo.Get / SetValue. عبر Reflection.Emit، يمكنك تنبعث مباشرة كود IL، على سبيل المثال في المجالس جمعت حيوي، وتنفيذ هذه التعليمات البرمجية. بالطبع، يمكن هذا الرمز الوصول إلى الممتلكات الخاصة بك.

وانا اشك ان هذا سيكون أسرع بكثير ثم استخدام PropertyInfo في نهاية المطاف، وانها لم تصدر لهذا الغرض أيضا. هل يمكن استخدام Reflection.Emit كما مولد رمز مترجم صغير، على سبيل المثال.

وعن طريق Reflection.Emit يبدو قليلا جدا "ذكية"، فضلا عن تحسين سابق لأوانه. إذا كنت ملف التطبيق الخاص بك، وتجد أن GetValue / انعكاس SetValue هو عنق الزجاجة، ثم هل يمكن أن تنظر في تحسين، ولكن ربما ليس حتى ذلك الحين ...

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