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<AnimalEntityId>
{
public AnimalEntityId()
: base()
{
}
private AnimalEntityId(string value)
: base(value)
{
}
}
public abstract class EntityId<TEntityId>
{
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();
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKCnB1YmxpYyBjbGFzcyBUZXN0CnsKCQoJCgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQlBbmltYWxFbnRpdHlJZCBpZCA9IEFuaW1hbEVudGl0eUlkLlBhcnNlKEd1aWQuTmV3R3VpZCgpLlRvU3RyaW5nKCkpOwoJCUNvbnNvbGUuV3JpdGVMaW5lKGlkKTsKCX0KfQoKcHVibGljIGNsYXNzIEFuaW1hbEVudGl0eUlkIDogRW50aXR5SWQ8QW5pbWFsRW50aXR5SWQ+CnsKICAgIHB1YmxpYyBBbmltYWxFbnRpdHlJZCgpCiAgICAgICAgOiBiYXNlKCkKICAgIHsKICAgIH0KCiAgICBwcml2YXRlIEFuaW1hbEVudGl0eUlkKHN0cmluZyB2YWx1ZSkKICAgICAgICA6IGJhc2UodmFsdWUpCiAgICB7CiAgICB9Cgp9CgoKcHVibGljIGFic3RyYWN0IGNsYXNzIEVudGl0eUlkPFRFbnRpdHlJZD4KewogICAgcHJpdmF0ZSByZWFkb25seSBTeXN0ZW0uR3VpZCB2YWx1ZTsKCiAgICBwdWJsaWMgc3RhdGljIFRFbnRpdHlJZCBQYXJzZShzdHJpbmcgdmFsKQogICAgewogICAgCXZhciBjb25zdHIgPSB0eXBlb2YoVEVudGl0eUlkKS5HZXRDb25zdHJ1Y3RvcigKICAgIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5Ob25QdWJsaWMsCiAgICBudWxsLCBuZXdbXXt0eXBlb2Yoc3RyaW5nKX0sIG51bGwpOwogICAgCWlmIChjb25zdHIgPT0gbnVsbCkgewogICAgCQl0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm8gY29uc3RydWN0b3IiKTsKICAgIAl9CiAgICAgICAgcmV0dXJuIChURW50aXR5SWQpY29uc3RyLkludm9rZShuZXcgb2JqZWN0W10ge3ZhbH0pOwogICAgfQoKICAgIHByb3RlY3RlZCBFbnRpdHlJZChzdHJpbmcgdmFsdWUpCiAgICB7CiAgICAgICAgdGhpcy52YWx1ZSA9IFN5c3RlbS5HdWlkLlBhcnNlKHZhbHVlKTsKICAgIH0KCiAgICBwcm90ZWN0ZWQgRW50aXR5SWQoKQogICAgewogICAgICAgIHRoaXMudmFsdWUgPSBTeXN0ZW0uR3VpZC5OZXdHdWlkKCk7CiAgICB9Cn0=