public T GetParent<T>() where T : BaseClass
return ((Node<T>)this).Parent;
static public Node<T> Create<T>(T innerClass) where T : BaseClass
return new Node<T>(innerClass);
static public T GetParent<T>(T child) where T: BaseClass
return child.ContainerNode.GetParent<T>();
public class Node<T> : Node where T : BaseClass
public T Parent { get; set; }
public T This { get; set; }
public Node(T innerClass)
innerClass.ContainerNode = this;
public Node(T innerClass, T parent)
innerClass.ContainerNode = this;
static public implicit operator T (Node<T> input)
public abstract class BaseClass
public Node ContainerNode { get; set; }
public class DerivedClass1 : BaseClass
protected DerivedClass1 Parent
return Node.GetParent(this);
public class DerivedClass2 : BaseClass
public static void Main()
var child1 = Node.Create(new DerivedClass1());
var parent1 = Node.Create(new DerivedClass1());
DerivedClass1 implicitlyCast = child1;
var child2 = Node.Create(new DerivedClass2());
var parent2 = Node.Create(new DerivedClass1());