Есть ли способ построить объект, используя строковое представление его составных частей без использования какого-либо отражения для этого конкретного шага? - PullRequest
1 голос
/ 27 апреля 2011

Предположим, у меня есть какой-то объект MyObject obj и я хочу получить доступ к свойству этого объекта, например obj.SomeCollection.SomeProperty.Можно ли получить это свойство для этого объекта, комбинируя obj и .SomeCollection.SomeProperty, представленные в виде строки, без вызова какой-либо функции отражения для этого конкретного шага?

ОБНОВЛЕНИЕ: причина, по которой я пытаюсьизбегать рефлексии из-за огромного удара по производительности.По сути, я буду использовать отражение, чтобы извлечь представление строк из его составных частей и сохранить их в каком-то словаре, который будет повторно использоваться с этого момента, таким образом, избегая использования отражения каждый раз, когда мне понадобится доступ к свойствам объекта.Причина, по которой меня так беспокоит производительность, заключается в том, что мне нужно использовать этот процесс, если он существует, для системных модульных тестов уровня предприятия.С учетом этого использование становится нереальным, так как выполнение этих тестов может занять до часа.Надеюсь, это объясняет мою позицию.

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Хотя я склонен согласиться с @Scott (почему бы не использовать Reflection, идеально подходит для этого ...), если вы можете сериализовать объект в XML или, что еще лучше, в XML DataSet, вы можете использовать различные варианты для согласования объект со строками в качестве идентификаторов.

После редактирования опубликовано следующее @Ukraine Train 2 комментария: производительность

@ Ukraine Train, Ни рефлексия, ни XML-сериализация не являются собаками реальной производительности. «Производительность» зависит от того, сколько итераций вы хотите обработать и как быстро вы хотите их обработать. Когда вы выполняете создание объекта с помощью рефлексии или сериализации XML, объект находится «в памяти», и весь доступ осуществляется через указатели. Сколько объектов вы хотите хранить в памяти одновременно, как долго вы хотите, чтобы они жили, - все это стратегические решения. У меня недостаточно информации, чтобы проконсультировать вас.

Если вы хотите иметь возможность опрашивать объект, используя строковые идентификаторы, ваш выбор в значительной степени является отражением или сериализацией. Я полагаю, что вы переоцениваете эффективность отражения, когда называете ее огромным . Самое быстрое, что вы можете сделать, это ничего, все остальное требует времени и ресурсов.

0 голосов
/ 27 апреля 2011

Вы можете использовать ключевое слово dynamic, новое в C # 4. Это позволяет вам использовать методы и свойства объекта, не известного во время компиляции. Вы можете прочитать об этом на MSDN здесь , но основное использование:

public static void Main()
{
     // Instantiate or retrieve your object into memory
     dynamic obj = RetrieveCustomObject();

     // Invoke methods on object not known at compile time
     int id = obj.Id;
     bool result = obj.DoWork();
}

Пока методы экземпляра существуют и могут быть разрешены во время выполнения, они будут успешно выполняться. Если они не существуют, генерируется исключение времени выполнения.

Это не использует строковые представления методов объекта, как вы просили, но это может стоить рассмотреть в любом случае. С точки зрения производительности, этот должен хорошо сравниваться с другими описанными методами. Тем не менее, вы должны профилировать ваше приложение, чтобы проверить, какой метод вы выберете.

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