Какие существуют инструменты/библиотеки, которые будут занимать структуру и автоматически генерировать неизменяемую оболочку, а также класс «строитель» для постепенного создания новых экземпляров?Автоматическая генерация неизменяемого класса и класса сопоставимого класса
Пример входных данных:
struct Foo
{
public int apples;
public int oranges;
public Foo Clone() {return (Foo) base.MemberwiseClone();}
}
Пример вывода:
public class ImmutableFoo // could probably be a struct
{
private Foo snapshot;
internal ImmutableFoo(Foo value) { this.snapshot = value; }
public FooBuilder Builder() { return new FooBuilder(snapshot); }
public int Apples { get { return snapshot.apples; } }
public int Oranges { get { return snapshot.oranges; } }
}
public class FooBuilder
{
private Foo state;
public int Apples { get { return state.apples; } set { state.apples = value; } }
public int Oranges { get { return state.oranges; } set { state.oranges = value; } }
public FooBuilder() { }
internal FooBuilder(Foo toCopy) { state = toCopy.Clone(); }
public ImmutableFoo Build()
{
ImmutableFoo result = new ImmutableFoo(state);
state = state.Clone();
return result;
}
}
Такой «инструмент» может быть IDE плагин или может генерировать новый класс во время выполнения с помощью отражения.
Пример в C#, но я был бы заинтересован в растворе для любой статически типизированного языка OO (Java, Scala, C++ и т.д.)
желателен Особенности:
- воссоздает методы от структуры в классе строителя
- Повторно создает неразрушающие методы из структуры в неизменном классе (ЭСП.
Equals()
иGetHashCode()
и любой интерфейсных метод) - генерирует также в
IFooReader
, содержащий свойства только для чтения для каждого члена структуры, реализуемые как неизменяемыми, так и строителями. - Если класс поля имеет неизменный эквивалент, он использует неизменяемую версию в неизменяемом классе (см. Также How do I create a builder in C# for an object that has properties that are referenc types?), например.
List
->ReadOnlyCollection
или аналогичный. - В качестве альтернативы взять класс строитель в качестве входных данных (где строитель использует автоматические свойства вместо делегирования на структуру.)
- Не требует метода
Clone
быть предопределен
«Вы не должны использовать инструмент как это, потому что ... »ответы также приветствуются.
5) Используйте Roslyn для анализа вашего кода и t4 для создания построителя –