这是我第一次在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()”的东西)并使用该类型引用属于这些类型的静态变量,但我不知道如何做或者甚至可能
我很高兴甚至找到不能直接回答这些问题的解决方案,而是通过简单而优雅的设计解决问题。 =)
帮助! (谢谢!)
答案 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;
}
}
}