C # does not support duck-typing compilation, so if you cannot change your types, you're out of luck.
You can access your property with dynamic , which allows you to use duck print at runtime (there is no compilation time check, and you lose intellisense if you use Visual Studio):
c1 c1o = new c1() { Prop3 = "test" }; string res = ((dynamic)c1o).Prop3;
Or through reflection:
c1 c1o = new c1() { Prop3 = "test" }; string res = (string)c1o.GetType().GetProperty("Prop3").GetValue(c1o);
Since there is no compile time check, you need to handle exceptions if you pass the instance without Prop3 .
Or, if the types are not sealed, you can try to implement your derived types, where you can specify the interface:
public interface ic { string Prop3 { get; set; } } public class c1d : c1, ic {} public class c2d : c2, ic {} public class c3d : c3, ic {}
To do this, you need to control the creation of instances, but instances must be of type c1d , c2d , c3d , will not work if you get objects of type c1 , c2 or c3
You can do explicit type conversions as @David pointed out (this is a smart trick), but that means you will have two instances of your object. For a very simple case like the one presented in the question, it might ... if you need something more advanced, it can be quite difficult