Obtendo um valor por reflexão sem lixo
-
24-09-2019 - |
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");
}
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.