在C#中,假设您有一个对象(例如myObject
),它是类MyClass
的一个实例。
仅使用myObject
,您将如何访问MyClass
的静态成员?
class MyClass
{
public static int i = 123 ;
}
class MainClass
{
public static void Main()
{
MyClass myObject = new MyClass() ;
myObject.GetType().i = 456 ; // something like this is desired,
// but erroneous
}
}
答案 0 :(得分:25)
你必须使用反射:
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
来获得正确的值。
答案 1 :(得分:10)
如果您拥有对MyClass的控制权并且需要经常这样做,我会添加一个可以访问的成员属性。
class MyClass
{
private static int _i = 123;
public virtual int I => _i;
}
答案 2 :(得分:4)
您只需使用:MyClass.i
要详细说明,为了使用静态成员,您必须了解该类。并且具有对象引用是无关紧要的。对象最重要的唯一方法是当你有两个不同的类,它们都有一个相同的外观成员:
class A { public static int i; }
class B { public static int i; }
但是A.i
和B.i
是完全不同的字段,它们之间没有逻辑关系。即使B继承自A,反之亦然。