【问题标题】:C# -- how does one access a class' static member, given an instance of that class?C#——给定一个类的实例,如何访问一个类的静态成员?
【发布时间】:2009-07-14 14:12:23
【问题描述】:

在 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
        }
    }

【问题讨论】:

  • 你能解释一下为什么不能更直接地引用它吗?这里有一点代码味道。
  • 我的方法接受一个 Block 类型的参数,但实际传递的参数是 Block 的几个 子类 之一的一个类,每个子类是拥有自己的静态成员副本(这个角色在我的问题代码中由“i”扮演)。
  • 恕我直言,通常是“我该怎么做?”的最佳答案。是“不要那样做”。我强烈怀疑这是其中之一。
  • 是的,与拥有总是可以返回适当值的多态属性相比,这感觉像是一种丑陋(且缓慢)的方式。
  • (有关示例,请参见我编辑的答案。)

标签: c# static gettype


【解决方案1】:

你必须使用反射:

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 来获得正确的值。

【讨论】:

  • 随着细节的发布,这似乎有点过头了,因为他只能引用 MyClass.StaticMember 只有当 myObject 可以是多个类并且您在开发时不知道哪个类时才真正重要。
  • @Robert:这正是他的情况。请参阅问题的 cmets。
  • 但它应该是静态的。我也遇到了这个问题。
  • @mireazma:恐怕真的不清楚你的意思。什么应该是静态的?
  • @mireazma:那么根据我的回答,您要么需要使用反射,要么引入一个在每个子类中都被覆盖的虚拟实例成员。 .NET 的类型系统根本不具备您正在寻找的那种“静态多态性”。
【解决方案2】:

如果您可以控制 MyClass 并且需要经常这样做,我会添加一个成员属性,让您可以访问。

class MyClass
{
    private static int _i = 123;

    public virtual int I => _i;
}

【讨论】:

    【解决方案3】:

    您只需使用:MyClass.i

    稍微详细一点,为了使用静态成员,您必须了解类。并且拥有对象引用是无关紧要的。唯一重要的对象是当你有 2 个不同的类时,它们都有相同的成员:

    class A { public static int i; }
    class B { public static int i; }
    

    但是A.iB.i是完全不同的字段,它们之间没有逻辑关系。即使 B 继承自 A,反之亦然。

    【讨论】:

    • 我希望能够仅使用引用 myObject 访问静态成员 i
    • Johannes,我读到了,但不认为这是一个真实的(主义)问题。
    • JaysinFix,在您提供的示例中 MyClass.i 是唯一明智的答案,也许您可​​以更好地解释一下?这个乞求一个“为什么”
    • Henk,请参阅我在问题下的上述评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2019-07-13
    • 1970-01-01
    • 2022-11-13
    • 2012-07-02
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多