Frage

Ich schreibe ein System, mit dem ich die Werte von Eigenschaften in einem Objekt abrufen muss, vorzugsweise mit Reflexion. Dieses Projekt ist für den Xbox360, das im kompakten Framework ausgeführt wird und somit einen langsamen Müllsammler hat - das bedeutet, dass es absolut wichtig ist, dass ich Zuweisungen vermeide!

Ich habe nur festgestellt, dass ich dies getan habe, ist:

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

Ich mag das aus 2 Gründen nicht:

  • Casting ist für Töpfer, Generika ist für Programmierer
  • Es schafft offensichtlich jedes Mal, wenn ich einen primitiven Wert erhalten muss, und es wird gebeugt.

Gibt es eine generische Methode, um den Wert aus einer Eigenschaft zu erhalten, die keine Primitiven boxen?

Bearbeiten :: Als Antwort auf die Antwort von Jons verursacht dieser Code aus seinem Blog keine Zuordnungen, Problem gelöst:

        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");
        }
War es hilfreich?

Lösung

Eine Alternative wäre, einen Delegierten aus der Getter -Methode mithilfe der Getter -Methode zu erstellen Delegate.CreateDelegate - Ich weiß nicht, ob dies in der von der Xbox verwendeten kompakten Framework -Version unterstützt wird.

Ich habe ein Blogeintrag an Delegate.CreateDelegate Was Sie vielleicht nützlich finden - aber auch hier müssen Sie sehen, wie viel davon für die Xbox anwendbar ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top