As others suggested the most likely answer you want is Object.MemberWiseClone() (vote them up, not me.)
However, if the following caveat is a concern to you, you may want to just write your own copy-constructor in C#.
If a field is a reference type, the reference is copied but the referred object is not; therefore, the original object and its clone refer to the same object.
class Foo
{
public Foo()
{
this.MyInt = 99;
this.MyString = "Hello, World";
}
// This copy constructor can be as deep or shallow as you want,
// and can instantiate new instances of any of source's
// reference-type properties if you don't want both Foo's to refer
// to the same references. (MyBar, in this elementary example).
public Foo(Foo source)
{
this.MyInt = source.MyInt;
this.MyString = source.MyString;
// For example, using another copy constructor.
this.MyBar = new Bar(source.MyBar);
}
public int MyInt { get; set; }
public string MyString { get; set; }
public Bar MyBar { get; set; }
}
class Bar
{
public Bar(Bar source)
{
}
// ...
}
Of course, that copy constructor can be as simple or as complex as you need.