Вы должны использовать отражение:
Type type = myObject.GetType();
FieldInfo field = type.GetField("i", BindingFlags.Public |
BindingFlags.Static);
int value = (int) field.GetValue(null);
Я бы вообще старался избегать этого, хотя ... это очень хрупко. Вот альтернатива, использующая нормальное наследование:
public class MyClass
{
public virtual int Value { get { return 10; } }
}
public class MyOtherClass : MyClass
{
public override int Value { get { return 20; } }
}
и т.д.
Тогда вы можете просто использовать myObject.Value
, чтобы получить правильное значение.