using Newtonsoft.Json;
namespace prototypepattern
{
public interface Person
{
public string Name { get; set; }
public Person Clone(bool deepclone);
}
public class Manager : Person
{
public string Name { get; set; }
public Manager(string name)
{
Name = name;
}
public Person Clone(bool deepclone=false)
{
if (deepclone)
{
var jsonObject = JsonConvert.SerializeObject(this);
return JsonConvert.DeserializeObject(jsonObject);
}
return (Person)MemberwiseClone();
}
}
public class Employee : Person
{
public string Name { get; set; }
public Manager Manager { get; set; }
public Employee(string name, Manager manager)
{
Name = name;
Manager = manager;
}
public Person Clone(bool deepclone=false)
{
if (deepclone)
{
var jsonObject = JsonConvert.SerializeObject(this);
return JsonConvert.DeserializeObject(jsonObject);
}
return (Person)MemberwiseClone();
}
}
}
PROGRAM.CS
// See https://aka.ms/new-console-template for more information
using prototypepattern;
var manager = new Manager("Anurag");
var managerClone = (Manager)manager.Clone();
Console.WriteLine($"Cloned Manager::{managerClone.Name}");
var employee = new Employee("Narasimha", managerClone);
var employeeclone = (Employee)employee.Clone(true);
Console.WriteLine($"Employee is {employeeclone.Name} & manager is {employeeclone.Manager.Name}");
managerClone.Name = "Abhishek";
Console.WriteLine($"Employee is {employeeclone.Name} & manager is {employeeclone.Manager.Name}");

OUTPUT
Cloned Manager::Anurag
Employee is Narasimha & manager is Anurag
Employee is Narasimha & manager is Anurag
GITHUB