Отражение.NET - Как получить “реальный” тип от ParameterInfo

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

Q = "Для вас в пользователях FILTER 'x@example.com' = u.email" [ 1111]

должен сначала добавить в запрос предложение LIMIT и только заставить его возвращать постоянное значение (в отличие от полного документа).

Например, следующий запрос возвращает одно совпадение, если такой документ существует, или пустой массив, если совпадения нет:

FOR u IN users FILTER 'x@example.com' == u.email LIMIT 1 RETURN 1

(обратите внимание, что я также изменил оператор из = на ==, потому что в противном случае запрос не будет проанализирован).

Обратите внимание, что этот запрос может принести большую пользу от создания индекса для атрибута поиска, то есть email. Без индекса запрос будет выполнять полное сканирование коллекции и останавливаться на первом совпадении, тогда как с индексом он будет считывать не более одной записи индекса.

Наконец, чтобы ответить на ваш вопрос, шаблон для EXISTS-подобного запроса затем станет

LENGTH(%Q LIMIT 1 RETURN 1)

или уточнен с помощью примера запроса:

LENGTH(FOR u IN users FILTER 'x@example.com' == u.email LIMIT 1 RETURN 1)

[ 118] вернет количество совпадений, которое в этом случае будет либо 0, либо 1. И это также может быть использовано в условиях фильтра, например, как показано ниже

FOR ....
  FILTER LENGTH(...)
  RETURN ...

, потому что LENGTH(...) будет либо 0, либо 1, который в контексте условия FILTER оценивается как ложный или истинный.

19
задан randy909 10 April 2009 в 17:19
поделиться

2 ответа

Параметр out имеет значение "by ref" - так что вы найдете pInfo.ParameterType.IsByRef возвращает true. Чтобы получить базовый тип not-ref, вызовите GetElementType () :

Type realType = pInfo.ParameterType.GetElementType();

(Разумеется, делать это следует только в том случае, если имеет значение по ref. Это относится к ref параметры тоже.)

25
ответ дан 30 November 2019 в 04:08
поделиться

Является ли pInfo.ParameterType тем типом, который вы ищете?

Согласно документам, свойство ParamterType класса PropertyInfo: " Объект Type, который представляет тип этого параметра. "

Кроме того, следующий код дает ожидаемый результат:

    Type t = typeof (X);
    var mi = t.GetMethod("Method");
    var parameters = mi.GetParameters();
    foreach(Type parameterType in parameters.Select(pi => pi.ParameterType))
            Console.WriteLine(parameterType.IsByRef ? parameterType.GetElementType() : parameterType);

Редактировать: Как указывает Джон Скит, если параметр по ссылке; Вы должны использовать GetElementType, чтобы получить правильный тип. Я обновил пример кода.

5
ответ дан 30 November 2019 в 04:08
поделиться
Другие вопросы по тегам:

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