4

私は、できればリフレクションを使用して、オブジェクトのプロパティの値をフェッチする必要があるシステムを作成しています。このプロジェクトは、コンパクトなフレームワークで実行されるため、ガベージコレクターが遅い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つの理由でこれが嫌いです:

  • キャスティングは陶芸家向け、ジェネリックはプログラマー向けです
  • プリミティブ値を取得する必要があるたびに明らかにガベージが作成され、ボックス化されます。

プロパティから値を取得するための一般的な方法はありますか?これはプリミティブをボックス化しませんか?

編集::ジョンズの回答に応えて、彼のブログから盗まれたこのコードは割り当てを引き起こさず、問題は解決しました:

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

1 に答える 1

3

1 つの代替方法は、次を使用してゲッター メソッドからデリゲートを作成することDelegate.CreateDelegateです。ただし、Xbox で使用されるコンパクトなフレームワーク バージョンでそれがサポートされているかどうかはわかりません。

役に立つと思われるブログ記事Delegate.CreateDelegateありますが、Xbox にどれだけ適用できるかを確認する必要があります。

于 2010-03-04T10:08:18.997 に答える