我有一个类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: 错误消息:
答案 0 :(得分:0)
一般来说,实例没有名字。 (您可以创建一个具有Name
属性的类,但框架不会关心它。)您必须传递给PropertyInfo.GetValue
的值是对该对象的引用,您想要获取的属性。传递名称对框架没有意义。 (除了其他任何东西,它没有上下文 - 在各种地方都可能有很多的变量名称。)
变量有名字。如果您所拥有的名称是指本地变量,那么您运气不佳 - 但如果您所拥有的名称是指某个字段,则可以通过反射进入该字段。得到正确的FieldInfo
,然后得到它的值。
但是,将XML文件中可能遇到的名称Dictionary<string, object>
映射到要为其获取属性的相应对象可能更好。或者,您可以使用switch
语句来获取正确的值 - 这实际上取决于上下文。
通常,将类实现(字段名称)绑定到XML文件是一个坏主意,IMO。