Требуется сгенерировать оператор десериализации для заданного поля. Пусть сигнатура метода будет следующей:
private сгенерироватьОператор(поле : IField) : PExpr
{
}
Оператор десериализации различен для каждого типа. Например для типа int мы должны получить:
def _поле1 = reader.ReadInt32();
для типа float:
def _поле1 = reader.ReadSingle();
и так далее...
Вопрос: как красиво сделать сопоставление с образцом в методе сгенерироватьОператор()?
На данный момент мне в голову ничего не приходит кроме этого:
private сгенерироватьОператор(поле : IField) : PExpr
{
def имя = Macros.UseSiteSymbol(поле.Name);
match (поле.GetMemType().SystemType.FullName)
{
| "System.Byte" => <[ def $(имя : name) = reader.ReadByte() ]>;
| "System.SByte" => <[ def $(имя : name) = reader.ReadSByte() ]>;
| "System.Int16" => <[ def $(имя : name) = reader.ReadInt16() ]>;
| "System.UInt16" => <[ def $(имя : name) = reader.ReadUInt16() ]>;
| "System.Int32" => <[ def $(имя : name) = reader.ReadInt32() ]>;
| "System.UInt32" => <[ def $(имя : name) = reader.ReadUInt32() ]>;
}
}
что выглядит совершенно по дилетантски...