Получение значения по отражению без мусора - PullRequest
4 голосов
/ 04 марта 2010

Я пишу систему, которая требует от меня извлечения значений свойств объекта, предпочтительно с использованием отражения. Этот проект предназначен для 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");
        }

1 Ответ

2 голосов
/ 04 марта 2010

Одной из альтернатив может быть создание делегата из метода получения с использованием Delegate.CreateDelegate - я не знаю, поддерживается ли это в компактной платформе, используемой Xbox.

У меня есть сообщение в блоге на Delegate.CreateDelegate, которое может оказаться полезным, но, опять же, вам нужно будет узнать, насколько оно применимо к Xbox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...