Pergunta

Estou escrevendo um sistema que exige que eu busque os valores das propriedades em um objeto, de preferência usando a reflexão. Este projeto é para o Xbox360, que é executado na estrutura compacta e, portanto, possui um coletor de lixo lento - isso significa que é absolutamente vital que eu evite alocações!

A única maneira de fazer isso é:

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

Não gosto disso por 2 motivos:

  • O elenco é para oleiros, genéricos é para programadores
  • Obviamente, cria lixo toda vez que tenho que obter um valor primitivo e ele é encaixotado.

Existe algum método genérico para obter o valor de uma propriedade, que não fará as primitivas de caixa?

Edit :: Em resposta a Jons Responder, este código roubado de seu blog não causa alocações, problema resolvido:

        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");
        }
Foi útil?

Solução

Uma alternativa seria criar um delegado a partir do método getter usando Delegate.CreateDelegate - Não sei se isso é suportado na versão Compact Framework usada pelo Xbox.

eu tenho um Postagem do blog sobre Delegate.CreateDelegate O que você pode achar útil - mas, novamente, precisará ver quanto disso é aplicável ao Xbox.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top