2010-10-20 5 views
5

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

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

Спасибо, Erick

+0

Вы не хотите использовать отражение из-за воздействия производительности, но с удовольствием используете * dynamic *? –

+0

@Kirk: Dynamic на самом деле работает на удивление хорошо. Это немного быстрее, чем отражение для доступа к членам ... –

+1

Вы думаете, что они будут влиять на производительность, или вы * знаете *? Конструктивные решения лучше сделаны на фактах. – smirkingman

ответ

2

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

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

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

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

+0

Рид, это тот ответ, который мне нужен, но я решил подходить к нему и попробовать исключить его. Благодаря! –

2

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

+0

+1 от меня - это был бы мой подход. Просто используйте объект и обрабатывайте исключения, если они приходят. –

+0

@ Подавать, поздравлять с 100 КБ! – JaredPar

+0

Спасибо! Просто передал это сегодня утром: D –