这是我事先提出的问题的扩展
我有一个我想要运行的特定功能,它位于XML文件中:
Console.WriteLine("Text for test, {0}, {1}", testWord, testWord2);
文本存储在XML文件中:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<world>
<region name="TestRegion">
<area name="TestArea">
<building name="Outside">
<room name="TutorialRoom">
<textToDisplay>"Text for test, {0},{1}"</textToDisplay>
<extraString>testWord,tesWord2</extraString>
</room>
</building>
</area>
</region>
</world>
</root>
我可以使用LINQ轻松获取字符串数据
XElement xelement = XElement.Load("..\\..\\LocationDatabase.xml");
var textToDisplay= xelement.Elements("world")
.Elements("region").Where(region => (string)region.Attribute("name") == "TestRegion")
.Elements("area").Where(area => (string)area.Attribute("name") == "TestArea")
.Elements("building").Where(building => (string)building.Attribute("name") == "Outside")
.Elements("room").Where(room => (string)room.Attribute("name") == "TutorialRoom")
.Elements("textToDisplay");
var extraString= xelement.Elements("world")
.Elements("region").Where(region => (string)region.Attribute("name") == "TestRegion")
.Elements("area").Where(area => (string)area.Attribute("name") == "TestArea")
.Elements("building").Where(building => (string)building.Attribute("name") == "Outside")
.Elements("room").Where(room => (string)room.Attribute("name") == "TutorialRoom")
.Elements("extraString");
这完全没问题。我遇到的问题是我在XML文件中没有单词,而是类的属性。我有一个单独的播放器,它有一个autoproperty名称。为了正常访问它,我可以说:
Console.WriteLine("Your name is:", Player.Instance.Name);
但是,我如何将其保留在XML文件中呢?像:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<world>
<region name="TestRegion">
<area name="TestArea">
<building name="Outside">
<room name="TutorialRoom">
<textToDisplay>"Your name is: {0}"</textToDisplay>
<extraString>Player.Instance.Name</extraString>
</room>
</building>
</area>
</region>
</world>
</root>
当我使用过去的命令时,简单认为整个部分是一个字符串,并输出“你的名字是:Player.Instance.Name”
使用我自己的代码的示例:
玩家类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GuardsOfAetheria
{
class Player
{
public enum Class
{
Melee,
Magic,
Ranged
}
public string Name { get; set; }
public Class PlayerClass { get; set; }
private static readonly Player instance = new Player();
static Player()
{
}
private Player()
{
}
public static Player Instance
{
get
{
return instance;
}
}
}
}
有没有办法解决这个问题?
编辑1: 我能够使用以下代码行做类似的事情:
var typ = typeof(Player);
var prop = typ.GetProperty("Name");
var propVal = prop.GetValue(Player.Instance);
Console.WriteLine(((string)textToDisplay.First()).Replace(@"\n", Environment.NewLine), propVal);
这很好用,并获得必要的数据。这里的问题是,在不同的部分,不同的类必须被称为var typ = typeof(Player)
,并且不同的实例必须被归因var propVal = prop.GetValue(Player.Instance)
。我可以存储我需要获取的类和实例的名称,但只是使用一个包含该数据的字符串不起作用,如下所示:
string className = "Player";
var typ = typeof(className);
var prop = typ.GetProperty("Name");
var propVal = prop.GetValue(Player.Instance);
Console.WriteLine(((string)textToDisplay.First()).Replace(@"\n", Environment.NewLine), propVal);
有没有这样做?
答案 0 :(得分:0)
Type player = Type.GetType("Player");
或
Type player = Type.GetType("myNamespace.Player");
然后你将不得不获得该类型的实例,请参阅操作类型。然后,您需要获取该类型的PropertyInfo
,然后为Instance对象获取您想要的Instance
等。
您需要深入了解告诉编译器您使用的对象以及要访问的属性。 Reflection是一种访问对象的运行时编译方式。它绝对比一般的计划更复杂。