2010-03-04 6 views
3

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

  • Кастинг для гончаров, дженерики для программистов
  • Это, очевидно, создает мусор каждый раз, когда я должен получить примитивное значение, и он получает коробку.

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

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

 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"); 
     } 
+2

ha, я могу украсть вашу цитату «гончаров»;) –

ответ

1

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

У меня есть blog post по адресу Delegate.CreateDelegate, который может оказаться полезным - но опять же, вам нужно посмотреть, насколько он применим к Xbox.

+0

А, выглядит интересно, я проведу какое-то расследование на консоли, когда вернусь домой сегодня вечером. Из интереса, сколько мусора создает ваша библиотека буферов протокола? – Martin

+0

@ Мартин: Я не знаю, если честно. Все наши встроенные значения неизменяемы, что, естественно, приводит к немного мусору - но это действительно зависит от того, как вы его используете. –

+0

Я подозреваю, что делегат.CreateDelegate делает литье из примитивного типа в штучной упаковке внутри себя:/ Похоже, мне нужно будет создать новую архитектуру :( – Martin

Смежные вопросы