Почему бы не использовать
type.GetProperties(BindingFlags.Static)
Для C ++ 03 действуют следующие правила:
После поиска имени (3.4) обнаруживает, что имя является именем шаблона, если за этим именем следует
<
,<
всегда используется как начало списка аргументов-шаблонов и никогда как имя, за которым следует оператор «меньше». При разборе идентификатора шаблона первый невложенный>
[сноска: A>
, который включает идентификатор типаdynamic_cast
,] static_cast
,reinterpret_cast
илиconst_cast
, или который включает аргументы шаблона последующего идентификатора шаблона, считается вложенным в целях этого описания. ] рассматривается как конец списка аргументов-шаблонов, а не как оператор "больше чем".
Таким образом, результат:
X<(16 > 1)> a; // works
X<(int(16) > 1)> b; // works
X<(16 >> 1)> c; // works
X<(int(16) >> 1)> d; // works
X<16 > 1> e; // fails
X<int(16) > 1> f; // fails
X<16 >> 1> g; // works (">>" is not a ">" token)
X<int(16) >> 1> h; // works (">>" is not a ">" token).
Однако, в C ++ 0x следующие правила
После того, как поиск имени (3.4) обнаруживает, что имя является именем шаблона, или что идентификатор-функции-оператора относится к набору перегруженных функций, любой член которых является шаблон функции, если за ним следует
<
,<
всегда используется в качестве разделителя списка аргументов шаблона и никогда не используется как оператор «меньше». При разборе списка аргументов-шаблонов первое невложенное> [foot-note: A>
включает идентификатор типаdynamic_cast
,static_cast
],reinterpret_cast
илиconst_cast
, или который включает в себя аргументы шаблона последующего идентификатора шаблона, считается вложенным для целей этого описания.] Вместо конечного разделителя используется чем оператор "больше". По аналогии,
According to Stroustrup: "The first non-nested > terminates a template argument list. If a greater-than is needed, parentheses must be used."
Thus, the compilers that tolerate the second set of expressions do so incorrectly; the compiler that fails on X<(int(16) >> 1)> d;
is buggy.