Customize type conversion between Lua and CLR types
SolarSharp’s type conversion system handles the translation between Lua values and CLR types. Custom converters allow you to define how specific types are converted, enabling seamless integration of custom types and specialized conversion logic.
public class Color{ public byte R { get; set; } public byte G { get; set; } public byte B { get; set; }}// Register converterScript.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion<Color>( (script, color) => { var table = new Table(script); table["r"] = color.R; table["g"] = color.G; table["b"] = color.B; return LuaValue.NewTable(table); });// Now Color objects convert to tables automaticallyvar script = new Script();var red = new Color { R = 255, G = 0, B = 0 };script.Globals["redColor"] = red;script.DoString(@" print(redColor.r) -- 255 print(redColor.g) -- 0 print(redColor.b) -- 0");
// For types you don't have generic access toScript.GlobalOptions.CustomConverters.SetClrToScriptCustomConversion( typeof(System.Drawing.Point), (script, obj) => { var point = (System.Drawing.Point)obj; var table = new Table(script); table["x"] = point.X; table["y"] = point.Y; return LuaValue.NewTable(table); });
public class Color{ public byte R { get; set; } public byte G { get; set; } public byte B { get; set; }}// Register converter from Lua table to ColorScript.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( DataType.Table, typeof(Color), (dynVal) => { var table = dynVal.Table; return new Color { R = (byte)(double)table["r"], G = (byte)(double)table["g"], B = (byte)(double)table["b"] }; });// Now Lua tables convert to Color automaticallyvar script = new Script();script.DoString(@" function createColor(r, g, b) return { r = r, g = g, b = b } end");LuaValue result = script.Call(script.Globals["createColor"], 128, 64, 255);Color color = (Color)result.ToObject(typeof(Color));Console.WriteLine($"RGB: {color.R}, {color.G}, {color.B}");
public class Temperature{ public double Celsius { get; set; } public Temperature(double celsius) { Celsius = celsius; }}// Convert from number (assume Celsius)Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( DataType.Number, typeof(Temperature), dynVal => new Temperature(dynVal.Number));// Convert from string (parse with unit)Script.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( DataType.String, typeof(Temperature), dynVal => { string str = dynVal.String; if (str.EndsWith("C")) { return new Temperature(double.Parse(str.TrimEnd('C'))); } else if (str.EndsWith("F")) { double f = double.Parse(str.TrimEnd('F')); return new Temperature((f - 32) * 5 / 9); } return new Temperature(0); });// Convert from tableScript.GlobalOptions.CustomConverters.SetScriptToClrCustomConversion( DataType.Table, typeof(Temperature), dynVal => new Temperature((double)dynVal.Table["celsius"]));