【问题标题】:Getting object name from string (C# / XNA)从字符串中获取对象名称 (C# / XNA)
【发布时间】:2014-01-22 16:40:56
【问题描述】:

我想在我的游戏中编写一种命令行调试功能,允许用户输入变量的名称:

int number = 38;

...并访问该变量的值,只需输入“数字”或该变量的任何名称即可。 有没有办法把一个字符串变成一个变量名,或者像这样从一个等价的字符串中获取一个变量的值?

return GetVariable("number");

或者这是完全错误的方法吗?有没有其他方法可以随时获取任何变量的值,只需在某个地方输入?

解决方案

所以这是人们应该使用的:

public static T getFromString<T>(object context, string get)
    {
        var use = context;
        BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
        FieldInfo field = use.GetType().GetField(get, bindFlags);
        Object value = field.GetValue(use);
        return (T)value;
    }

此代码有效。您只需要确保您的变量是在下面的 Foo 类中定义的。耶!

编辑:我再次编辑了该方法,现在它返回带有类型和您自己的上下文的变量。像这样使用它:

getFromString<int>(Game1, "number");

【问题讨论】:

  • 尝试反射技巧
  • 不幸的是,我对反射一无所知。不过我听说过。
  • 如果你的变量类型相同,使用简单的Dictionary
  • 使用字典确实违背了获得任何变量值的便捷方法的目的。使用字典,我必须声明我希望能够预先获得哪些变量的值。我有很多变量。这根本不方便或没有帮助。

标签: c# string xna integer converter


【解决方案1】:

如前所述,您需要使用反射或字典查找。对于反射,它类似于(假设私有实例字段):

FieldInfo field = type.GetField(fieldName, bindFlags);
Object value field.GetValue(instance);

GetValue 返回一个对象。如果您要返回控制台,您可能需要调用和 Console.WriteLine(value.ToString())。

更新

根据您在下面的评论进行了更新。我建议您参考 cmets 中已经提供的关于反射的链接。我总是发现从一个工作示例开始最容易,所以我在下面提供了一个。这应该可以实现您想要的。您可能需要对其进行调整以适合您的特定要求或应用程序。

class Program
{
    public class Foo
    {
        int number = 38;
    }

    static void Main( string[] args )
    {
        Foo foo = new Foo(); //create a new instance of the type that contains variable that you want the value of
        BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static; //define binding flags
        FieldInfo field = foo.GetType().GetField( "number", bindFlags ); //get the field from the object that has this name
        Object value = field.GetValue( foo ); //get the value of the field.
        Console.WriteLine( value.ToString() ); //output the value to the console.
    }
}

【讨论】:

  • 你假设我对反射有所了解。我真的对反射一无所知,所以这个答案对我没有帮助。你介意做一个更深入的答案吗?抱歉没看懂。
  • 谢谢!太糟糕了,我在 FieldInfo 上得到了一个 NULL REFERENCE EXCEPTION。我确实改变了一点......
  • 我编辑了我的原始问题以包含我的代码版本。
  • @Lemoncreme - 您应该能够将上面的代码粘贴到一个新的控制台应用程序中并运行它以查看它是否正常工作。然后从我的和你的之间的区别中回过头来。我必须走出去,但希望你很近。我稍后再回来查看。祝你好运。
  • @Lemoncreme - 非常好,很乐意提供帮助。请接受答案(点击勾号)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
相关资源
最近更新 更多