Получение ценности по отражению без мусора

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

Мне не нравится это по 2 причинам:

  • Кастинг для гондерс, дженерики для программистов
  • Очевидно, что это создает мусор каждый раз, когда я должен получить примитивную ценность, и он получает в штучной упаковке.

Существует ли какой-то универсальный метод получения значения из недвижимости, который не будет коробкой примитивов?

Редактировать :: В ответ на Джонс ответил, этот код украден из его блога не вызывает выделения, проблема решена:

        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