Thottam blogged about how C# and Reflection differ in binding to hidden properties: http://blogs.msdn.com/thottams/archive/2006/03/17/553376.aspx. So for the hidden properties you would not be able to bind to statically in C#, you can bind to them using Reflection. Consider the following class hierarchy:
class A
{
public string P
{... ...}
}
class B : A
public new int P
class C : B
public new object P
C.P hides B.P which in turn hides A.P. From the type C. If you want to get all the properties of C (including declared and inherited), you can do this:
Properties[] ps2 = typeof(C).GetProperties();
If you want to get all the properties declared on C, you can set the binding flag to DeclaredOnly.
Properties[] ps1 = typeof(C).GetProperties(BindingFlags.DeclaredOnly);
And with some set arithmetics it is not too difficult to get all the properties C inherited from B and A.
I used GetProperties in my illlustration above. GetProperty is similar except that if there are multiple hits, you get a System.Reflection.AmbiguousMatchException.
If you just want to get B.P from C, you can use one of the overrides of Type.GetProperty that allows you to specify the return type:
typeof(C).GetProperty("P", typeof(int));
If a property on the subclass has the exact same name and signature as the one in the superclass, you can call GetProperties() to get all the properties first and then use the DeclaredType property on PropertyInfo to find out the one you want.
The binding semantics for fields and methods are also very similar.
Note that in the sample above C.P HIDES B.P and A.P. And they are all considered different properties. If a property in a subclass OVERRIDES a property in the superclass, they are considered the same property. So you will get only one property when you call GetProperties on the subclass.