using System; using System.Reflection; public class Test { public static void Main() { AnimalEntityId id = AnimalEntityId.Parse(Guid.NewGuid().ToString()); Console.WriteLine(id); } } public class AnimalEntityId : EntityId { public AnimalEntityId() : base() { } private AnimalEntityId(string value) : base(value) { } } public abstract class EntityId { private readonly System.Guid value; public static TEntityId Parse(string val) { var constr = typeof(TEntityId).GetConstructor( BindingFlags.Instance | BindingFlags.NonPublic, null, new[]{typeof(string)}, null); if (constr == null) { throw new InvalidOperationException("No constructor"); } return (TEntityId)constr.Invoke(new object[] {val}); } protected EntityId(string value) { this.value = System.Guid.Parse(value); } protected EntityId() { this.value = System.Guid.NewGuid(); } }