【问题标题】:Access static variables by their names按名称访问静态变量
【发布时间】:2015-04-14 08:22:18
【问题描述】:

我正在编写一些 Unity C# 脚本。

public class SomeClass {    
     public static float radius;
}    

我有一个带有很多 static 变量的 class(我知道 static 变量可能是一种不好的做法,但我不是实现这些 static 变量的人,我需要使用它们)。

在另一个脚本中,我需要更改这些变量的值。 所以我使用SomeClass.radius = val 访问它们,但我想使用它们的名称访问它们:

SomeFunction(string name) { theVariableCorespondingToTheName = val }

这似乎微不足道,但无法弄清楚如何使其工作(我是 C# 新手)。我是否需要一个函数来返回我的class 中包含我的static 字段的变量的引用?

【问题讨论】:

  • 请改用单个 Dictionary<string, float>。然后添加像dict.Add("radius", defaultValue) 这样的值。稍后您可以通过dict[name] = val; 更新它们。
  • 没有看到你的帖子谢谢我会试试看。

标签: c# unity3d static ref


【解决方案1】:

显然,可以改进具有大量静态元素的设计。但是,您似乎无法直接控制它,所以这里有一种使用反射来完成您需要的方法:

typeof(SomeClass).GetField("radius").SetValue(null, val);

【讨论】:

  • 您是否经常在代码中使用反射?大多数没有经验的用户要求反思,因为他们不知道解决他们需求的其他方法。所以在大多数情况下,这些都是 XY 问题。
  • 对于可移植库,它看起来略有不同,但足够接近猜测。
  • @TimSchmelter 看起来 OP 想要一种变通方法来处理其他人的代码。他不是在寻找设计建议。
  • 谢谢,是的,我正在处理其他人的代码,我无法更改太多(不幸的是,设计并不完美)。我想我会暂时使用反射并尝试实现字典。
【解决方案2】:

如果你真的不能改变设计,你必须使用反射。但是,编译器将不再知道所有字段都被键入为浮点数,您将获得大量样板代码并损失大量性能。 反射的确切语法根据您使用的 .NET 版本而有所不同。

如果允许您更改字段,更好的解决方案是创建一个 Dictionary<string, float>,正如 Tim Schmelter 在 cmets 中所建议的那样。

【讨论】:

    猜你喜欢
    • 2019-09-28
    • 1970-01-01
    • 2012-11-22
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多