Кэширование рефлексов - PullRequest
       1

Кэширование рефлексов

0 голосов
/ 09 октября 2018

Учитывая объект o и член с именем s, где s является строкой, мы можем использовать отражение, чтобы получить поле o с именем s.

Как часть этого процесса, по-видимому, нам нужно найти некоторую таблицу метаданных для класса, чтобы выяснить, существует ли поле и где оно относительно базы объектов этого класса.

Но после этого, предполагая, что все объекты одного и того же класса имеют одинаковую компоновку, нам не нужно будет снова использовать отражение.Теперь мы получили смещение поля от базы, мы могли бы просто добавить указатель и быть в нужном месте для любого другого объекта этого класса.

Так что в любом случае есть «сохранить»результаты поиска отражения, чтобы их можно было повторно использовать на разных объектах одного типа?

1 Ответ

0 голосов
/ 09 октября 2018

Как-то так?

public class FieldReader<T> {
    private FieldInfo[] _fields;
    public FieldReader() {
        var theType = typeof(T);
        _fields = theType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
    }

    public void ShowFieldValuesforObject(T obj) {
        foreach (var field in _fields) {
            var val = field.GetValue(obj);
            Debug.WriteLine($"{field.Name}: {val}");
        }
    }
}

вы можете использовать это так:

public class TestClass {
    private int _age;
    public string _name;

    public TestClass(int age, string name) {
        _name = name;
        _age = age;
    }

    public static void Test() {
        var fieldReader = new FieldReader<TestClass>();
        var obj1 = new TestClass(12, "Angie");
        var obj2 = new TestClass(42, "Bob");
        Debug.WriteLine("Angie:");
        fieldReader.ShowFieldValuesforObject(obj1);
        Debug.WriteLine("Bob:");
        fieldReader.ShowFieldValuesforObject(obj2);
    }
}

Если я позвоню TestClass.Test(), я увижу это:

Angie:
_age: 12
_name: Angie 
Bob:
_age: 42
_name: Bob
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...