Требуется сгенерировать оператор десериализации для заданного поля. Пусть сигнатура метода будет следующей:
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() ]>;
}
}
что выглядит совершенно по дилетантски...
Здравствуйте, Dufrenite, Вы писали:
D>Вопрос: как красиво сделать сопоставление с образцом в методе сгенерироватьОператор()?
D>На данный момент мне в голову ничего не приходит кроме этого:...
Если набор типов ограничен и все они системные, то можно и так как делаешь ты.
Если набор типов расширяем и/или в него могут входить типы объявленные в текущем проекте, то лучше сделать как-то по другому. Например, можно завести хэш-таблицу в которой ключем будет тип (если не ошибаюсь MType), а значением цитата кода десериализующего этот тип. Тогда ты сможешь пополнять этот список соответствия динамически.
... << RSDN@Home 1.2.0 alpha rev. 637>>