Является ли Reflection лучшим способом определения наличия / отсутствия свойства / метода на динамическом объекте? - PullRequest
5 голосов
/ 20 октября 2010

У меня есть несколько методов доступа к данным, которые принимают параметр динамического объекта (то есть, динамический foo). Я не могу использовать интерфейс для определения типа входного параметра из-за существующего кода. Я устанавливаю свойства в методах доступа к данным, но использование динамического без проверки, чтобы увидеть, существуют ли свойства / методы, заставляет меня нервничать.

Поэтому я ищу способ проверить свойства / методы динамического объекта во время выполнения, но я бы предпочел не использовать отражение из-за влияния на производительность. Есть ли другой / рекомендуемый способ запроса свойств / методов динамического объекта?

Спасибо, Erick

Ответы [ 2 ]

2 голосов
/ 20 октября 2010

Отражение на самом деле не работает (как и следовало ожидать) на dynamic типах.Вам нужно проверить IDynamicMetaObjectProvider, а затем использовать его методы, чтобы определить, доступен ли член для типа.

Проблема в том, что для типа dynamic вполне приемлемодобавлять новых членов во время выполнения.Для примера см. ExpandoObject .Он только добавляет новые члены в операции над множествами, но вы также можете легко создать динамический тип, который всегда возвращает действительный член, независимо от того, что ему передано, например:

dynamic myType = new DynamicFoo();
Console.WriteLine(myType.Foo);
Console.WriteLine(myType.Bar);
Console.WriteLine(myType.Baz);

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

2 голосов
/ 20 октября 2010

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

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