الحصول على قيمة عن طريق التفكير دون القمامة

StackOverflow https://stackoverflow.com/questions/2378195

  •  24-09-2019
  •  | 
  •  

سؤال

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

الطريقة الوحيدة التي وجدتها للقيام بذلك هي:

Foo Something; //an object I want to get data from
PropertyInfo p; //get this via reflection for the property I want
object value = p.GetGetmethod().Invoke(Something, null);
//Now I have to cast value into a type that it should be

أنا لا أحب هذا لسببين:

  • الصب مخصصة للخزافين ، والأدوية المبرمجة مخصصة للمبرمجين
  • من الواضح أنه يخلق القمامة في كل مرة يجب أن أحصل فيها على قيمة بدائية ويحصل عليها.

هل هناك طريقة عامة للحصول على القيمة من خاصية ، والتي لن تربط بدائل؟

تحرير :: ردًا على إجابة جونز ، لا يسبب هذا الرمز الذي سُرق من مدونته تخصيصات ، تم حل المشكلة:

        String methodName = "IndexOf";
        Type[] argType = new Type[] { typeof(char) };
        String testWord = "TheQuickBrownFoxJumpedOverTheLazyDog";

        MethodInfo method = typeof(string).GetMethod(methodName, argType);

        Func<char, int> converted = (Func<char, int>)Delegate.CreateDelegate
            (typeof(Func<char, int>), testWord, method);

        int count = GC.CollectionCount(0);

        for (int i = 0; i < 10000000; i++)
        {
            int l = converted('l');

            if (GC.CollectionCount(0) != count)
                Console.WriteLine("Collect");
        }
هل كانت مفيدة؟

المحلول

أحد البديل هو إنشاء مندوب من طريقة getter باستخدام Delegate.CreateDelegate - لا أعرف ما إذا كان هذا مدعومًا في الإصدار الإطار المدمج الذي يستخدمه Xbox.

انا املك مشاركة مدونة على Delegate.CreateDelegate التي قد تجدها مفيدة - ولكن مرة أخرى ، ستحتاج إلى معرفة مقدار ما ينطبق على Xbox.

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