C# - 如何只给出类类型的静态类变量?

时间:2012-05-31 16:52:55

标签: c# xna reference-counting

这是我第一次在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()”的东西)并使用该类型引用属于这些类型的静态变量,但我不知道如何做或者甚至可能

我很高兴甚至找到不能直接回答这些问题的解决方案,而是通过简单而优雅的设计解决问题。 =)

帮助! (谢谢!)

6 个答案:

答案 0 :(得分:5)

如果您只有Type句柄,则可以执行以下操作:

var prop = givenType.GetProperty("bar");
var value = prop.GetValue(null);

答案 1 :(得分:2)

我会使用Dictionary代替,这可能是将一组值映射到另一组的最简洁方法。如果您要将int值与Type相关联,请执行以下操作:

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);
}

答案 2 :(得分:1)

int tempInt =(int)givenType.GetField(“bar”)。GetValue(null);

答案 3 :(得分:0)

如果我给你更正,这可能会让你有所了解:

使用System; 使用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());


    }
}

答案 4 :(得分:0)

好的,所以你有一组上电,你想要一个与每个上电相关的整数。你可以拥有一个静态集合,它可以保存所有的上电及其相关的整数值,而不是拥有很多类,每个类都有一个静态整数。

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

答案 5 :(得分: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;
        }
    }
}