使用字符串作为GetValue()的参数

时间:2015-02-14 09:23:26

标签: c# xml

我有一个类Player,以及一个名为player的类的实例。在该类中,我有一个名为Name的自动属性。

我需要从实例访问属性Name。我已经知道其他方法,但由于我希望这个程序要做,我需要通过以下方式完成:

var type= Type.GetType("GameSpace.Player")
var property = type.GetProperty("Name");
var propVal = property.GetValue(player);

Console.WriteLine(propVal);

此代码完美无缺。这里的问题是,有时,我需要更改实例的名称,在这种情况下是播放器。我想创建一个字符串来保存实例的名称。

string instanceName = "player";
enter code here
var type= Type.GetType("GameSpace.Player")
var property = type.GetProperty("Name");
var propVal = property.GetValue(instanceName);

Console.WriteLine(propVal);

但这不起作用,抛出GetValue没有允许字符串值的重载的错误。

有没有办法完成我的要求。我知道我可以简单地执行Console.WriteLine(player.Name),但在这种情况下,这不是一个选项,主要是因为参数(实例的名称)存储在XML文件中。

编辑1: 错误消息:

enter image description here

1 个答案:

答案 0 :(得分:0)

一般来说,实例没有名字。 (您可以创建一个具有Name属性的类,但框架不会关心它。)您必须传递给PropertyInfo.GetValue的值是对该对象的引用,您想要获取的属性。传递名称对框架没有意义。 (除了其他任何东西,它没有上下文 - 在各种地方都可能有很多的变量名称。)

变量有名字。如果您所拥有的名称是指本地变量,那么您运气不佳 - 但如果您所拥有的名称是指某个字段,则可以通过反射进入该字段。得到正确的FieldInfo,然后得到它的值。

但是,将XML文件中可能遇到的名称Dictionary<string, object>映射到要为其获取属性的相应对象可能更好。或者,您可以使用switch语句来获取正确的值 - 这实际上取决于上下文。

通常,将类实现(字段名称)绑定到XML文件是一个坏主意,IMO。