Существует ли эквивалент C# Ruby 'respond_to?'?

Некоторый очень усовершенствованный и полезный материал может все еще быть создан с помощью препроцессора (макросы), которые Вы никогда не были бы в состоянии сделать использование C++ "конструкции языка" включая шаблоны.

Примеры:

Создание чего-то и идентификатор C и строка

Простой способ использовать переменные перечислимых типов как строка в Метапрограммировании Препроцессора Повышения C

7
задан R. Martinho Fernandes 9 December 2009 в 23:06
поделиться

3 ответа

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

Просто вызовите Type.GetMethods () в интерфейсе и укажите тип передается, и убедитесь, что соответствующие методы существуют.


Edit:

Как было предложено itowlson , есть опция для обработки динамических типов, также. Если вы проверяете наличие интерфейса IDynamicMetaObjectProvider для переданного объекта, вы можете затем вызвать IDynamicMetaObjectProvider.GetMetaObject () . GetDynamicMemberNames () и использовать эту информацию.

Если интерфейс не существует, вы можете просто вернуться к Type.GetMethods ().

Это также должно обрабатывать «динамические» типы.

4
ответ дан 7 December 2019 в 12:21
поделиться

Я не знаю определенного способа проверить, предоставляет ли объект конкретный метод. Конечно, вы можете использовать отражение, но это работает только в том случае, если объект является объектом .NET. Если вы уверены, что это так, то, как уже было сказано, не проблема, просто вызовите GetType () для объекта и проверьте с помощью GetMethod ().

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

1
ответ дан 7 December 2019 в 12:21
поделиться

Используйте отражение для проверки методов:

if (duck.GetType().GetMethod("Bar") == null) {
    throw new ArgumentException("duck", "Bad dynamic object");
}
0
ответ дан 7 December 2019 в 12:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: