3

这是我第一次在 Stack Overflow 上发帖,所以希望我做的一切都是正确的,你们可以帮忙。

我想知道在 C# 中是否有一种方法可以访问属于一个类的静态变量,当只给出类的类型时。例如:

public class Foo
{
    public static int bar = 0;
}

public class Main
{
    public void myFunc(Type givenType)
    {
        int tempInt = ??? // Get the value of the variable "bar" from "Foo"
        Debug.WriteLine("Bar is currently :" + tempInt);
    }
}

// I didn't run this code through a compiler, but its simple enough
// that hopefully you should get the idea...

很难描述需要知道这一点的背景,但我正在 XNA 中制作游戏,并且我正在尝试使用引用计数来降低设计的复杂性。我在游戏中有物体和可以应用效果的道具(留在物体上)。能量提升可能会消失,但它们的影响仍然会留在对象上,我需要跟踪能量提升的任何影响是否仍然存在于对象上(因此,引用计数)。我计划用一个静态整数创建一个“PowerUpEffect”类(针对每种类型的上电),以保存仍然受它影响的对象的数量,但是游戏其余部分的设计不能很好地通过 PowerUpEffect一直到对象,以便它调用 PowerUpEffect 类的方法。

我希望只传递 PowerUpEffect 的类型(使用类似“typeOf()”之类的东西)并使用该类型来引用属于这些类型的静态变量,但我不知道该怎么做,或者它是否可能。

我什至很高兴找到不直接回答这个问题但以简单而优雅的设计解决问题的变通方法。=)

帮助!(谢谢!)

4

6 回答 6

5

如果你只有 Type 句柄,你可以这样做:

var prop = givenType.GetProperty("bar");
var value = prop.GetValue(null);
于 2012-05-31T16:58:26.423 回答
2

我会使用 aDictionary而不是,这可能是将一组值映射到另一组值的最简洁方式。如果您将int值与Types 相关联,则执行以下操作:

public static readonly Dictionary<Type, int> sTypeValues =
   new Dictionary<Type, int>
{
   { typeof(Type1), 5 },
   { typeof(Type2), 10 },
   { typeof(Type3), 2 },
   { typeof(Type4), 3 },
   { typeof(Type5), -7 }
};

然后你的功能变成:

public void myFunc(Type givenType)
{
    int tempInt = sTypeValues[givenType];
    Debug.WriteLine("Bar is currently :" + tempInt);
}
于 2012-06-01T05:48:29.287 回答
1

int tempInt = (int) givenType.GetField("bar").GetValue(null);

于 2012-05-31T17:00:00.160 回答
0

如果我让你正确,这可能会给你一些想法:

使用系统;使用 System.Reflection;

public class RStatic
{
    private static int SomeNumber {get; set;}
    public static object SomeReference {get; set;}
    static RStatic()
    {
        SomeReference = new object();
        Console.WriteLine(SomeReference.GetHashCode());
    }
}

public class Program
{
    public static void Main()
    {
        var rs = new RStatic();
        var pi = rs.GetType().GetProperty("SomeReference",  BindingFlags.Static | BindingFlags.Public); // i have used GetProperty in my case

        Console.WriteLine(pi.GetValue(rs, null).GetHashCode());


    }
}
于 2012-05-31T16:55:58.647 回答
0

好的,所以你有一个 powerups 的集合,并且你希望有一个与这些 powerups 中的每一个相关联的整数。与其拥有很多类,每个类都有一个静态整数,不如拥有一个静态集合来保存所有的通电及其相关的整数值。

public static class MyPowerupInfo
{
  public static Dictionary<PowerUp, int> PowerUps {get; private set;}
  static MyPowerupInfo
  {
    PowerUps = new Dictionary<PowerUp, int>();
    PowerUps.Add(*some power up object goes here*, 0);
    //TODO add other power ups
  }
}

然后要使用它,您可以执行以下操作:

int powerupCount = MyPowerupInfo.PowerUps[wickedAwesomePowerup];

或者:

public static void IncrementPowerup(Powerup powerup)
{
  MyPowerupInfo.PowerUps[powerup] = MyPowerupInfo.PowerUps[powerup]+1;
}
于 2012-05-31T17:00:38.253 回答
0

您是否假设您尝试访问的字段的名称(例如,对于“foo”类,字段“bar”)是基于 Type 参数的不同字段?

如果字段的名称是基于有限数量的允许类型已知的,您应该能够使用 switch 语句来确定它。例如:

public class Foo
{
    public static int bar = 0;
}

public class Baz
{
    public static int bing = 0;
}

public class Main
{
    public void myFunc(Type givenType)
    {
        switch (givenType.ToString())
        {
            case "Foo":
                Debug.WriteLine("Bar is currently :" + Foo.bar);
                break;
            case "Baz":
                Debug.WriteLine("Bing is currently :" + Baz.bing);
                break;
        }
    }
}
于 2012-05-31T17:11:52.717 回答