using System.Collections.Generic;
public static void Main()
var t = AddElement<TextElement>().Print();
var t2 = AddElement<TextElement>(text =>
text.Value = "Bfrffrgtgar";
var n = AddElement<NumberElement>();
var n2 = AddElement<NumberElement>(num =>
Console.WriteLine(t.ToString());
Console.WriteLine(t2.ToString());
Console.WriteLine(n.ToString());
Console.WriteLine(n2.ToString());
public static T AddElement<T>(Action<T> modifier = null) where T : UIElementBase, new()
public class UIElementBase : UIBase
public class TextElement : UIElement<TextElement>
public string Value = "Foo";
public override TextElement GetType()
public override string ToString()
public class NumberElement : UIElement<NumberElement>
public override NumberElement GetType()
public override string ToString()
public abstract class UIElement<T> : UIElementBase where T : UIElementBase
public new abstract T GetType();
public new abstract string ToString();
Console.WriteLine(ToString());