У меня есть небольшой вспомогательный класс, который генерирует скрипт, который позже используется в моем коде, а именно:
public class ScriptBuilder
{
public string Script { get; set; }
public ScriptBuilder NewLine(uint numberOfLines = 1)
{
if (numberOfLines == 0)
{
return this;
}
else
{
for (int i = 1; i <= numberOfLines; ++i)
{
Script += Environment.NewLine;
}
return this;
}
}
public ScriptBuilder WriteLine(string str = "")
{
if (str != "")
{
Script += str;
NewLine();
}
return this;
}
public ScriptBuilder(string line = "")
{
Script = line;
if (line != "")
{
NewLine();
}
}
public ScriptBuilder setLong(string longName, long x)
{
WriteLine("int " + longName + " " + x.ToString(System.Globalization.CultureInfo.InvariantCulture));
return this;
}
// + other set functions with different parameters/numbers of parameters
}
// ScriptBuilder is used like this :
ScriptBuilder scriptStringBuilder = new ScriptBuilder();
scriptStringBuilder
.WriteLine($"/!HEADSTART")
.WriteLine($"/! TYPE = {scriptType}")
.WriteLine($"/! NAME = {name}")
.WriteLine($"/! DESCRIPTION = {description}")
.WriteLine($"/!HEADEND")
/* the header is done now */
.NewLine(2);
Это довольно простой метод создания цепочек. Я хотел бы реализовать IF
и IF ELSE IF ELSE
на этом языке сценариев, но я не вижу действительно изящного способа сделать это.
Для IF
я придумал функцию-член:
public ScriptBuilder IF(bool condition, ScriptBuilder res)
{
if (condition)
{
return res;
}
else
{
return this;
}
}
, который можно использовать как:
ScriptBuilder.IF(condition,
scriptStringBuilder
.setThis(...)
.setThat(...)
;
)
но я не удовлетворен, потому что
scriptStringBuilder.setThis(...).setThat(...);
уже бы вступил в силу
- Я должен написать
scriptStringBuilder
, чтобы использовать его. Хотя нет подходящего представления о IF ELSE IF ELSE
.
Я мог бы использовать делегатов, например:
public delegate ScriptBuilder ScriptBuilderFunction(params object[] Parameters);
public ScriptBuilder IF(bool condition, ScriptBuilderFunction func)
{
// ...
}
но я даже не вижу, как это реализовать ...
В идеале я хотел бы написать:
scriptStringBuilder.
.setThis(...)
.setThat(...)
.IF(condition)
.THEN()
.setThis(...)
.doThat(...)
.ELSEIF(othercondition)
.makeThis(...)
.doThat(...)
.ENDIF()
.setThatNow(...)
;