Переделал работу с битовыми флагами, управляющими работой парсера и POS Tagger'а.
Раньше был такой код в C#-обертке:
public sealed class GrammarEngine
{
public const int SOL_GREN_ALLOW_FUZZY = 0x00000002;
public const int SOL_GREN_COMPLETE_ONLY = 0x00000004;
public const int SOL_GREN_PRETOKENIZED = 0x00000008;
public const int SOL_GREN_TOKENIZE_ONLY = 0x00000010;
public const int SOL_GREN_DISABLE_FILTERS = 0x00000020;
public const int SOL_GREN_ENABLE_RECONSTRUCTION = 0x00000040;
public const int SOL_GREN_SPARSE = 0x00000080;
public const int SOL_GREN_BOTTOMUP = 0x00000100;
public const int SOL_GREN_TOPDOWN = 0x00000200;
public const int SOL_GREN_REORDER_TREE = 0x00000400;
public const int SOL_GREN_MODEL = 0x00000800;
public const int SOL_GREN_FINDFACTS = 0x00001000;
// ...
//
http://www.solarix.ru/api/ru/sol_MorphologyAnalysis.shtml [DllImport(gren_dll, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr /*HGREN_RESPACK*/ sol_MorphologyAnalysis(
IntPtr hEngine,
string Sentence,
int Flags,
int UnusedFlags,
int max_msec,
int Language
);
}
Это практически копипаста с C++ исходника. Она, конечно, выполняет свою роль, но ее можно немножечко улучшить, воспользовавшись расширенными свойствами перечислений в C#:
public sealed class GrammarEngine
{
[Flags]
public enum MorphologyFlags
{
DEFAULT=0,
SOL_GREN_ALLOW_FUZZY = 0x00000002,
SOL_GREN_COMPLETE_ONLY = 0x00000004,
SOL_GREN_PRETOKENIZED = 0x00000008,
SOL_GREN_TOKENIZE_ONLY = 0x00000010,
SOL_GREN_DISABLE_FILTERS = 0x00000020,
SOL_GREN_MODEL = 0x00000800,
SOL_GREN_MODEL_ONLY = 0x00002000
}
[Flags]
public enum SyntaxFlags
{
DEFAULT=0,
SOL_GREN_REORDER_TREE = 0x00000400,
SOL_GREN_FINDFACTS = 0x00001000,
}
[DllImport(gren_dll, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr /*HGREN_RESPACK*/ sol_MorphologyAnalysis(
IntPtr hEngine,
string sentence,
MorphologyFlags flags,
SyntaxFlags unusedFlags,
int constraints,
int languageId
// ... );
}
Атрибут [Flags] нужен больше для отладки.
Плюс состоит в том, что Теперь даже сама сигнатура sol_MorphologyAnalysis и sol_SyntaxAnalysis подсказывает, какие значения можно указать для флагов.
Отрицательный нюанс - эти изменения ломают старый код, так как в C#, в отличие от C++, нет умолчальной конвертации enum'а в int.