C#用于接受来自XML的参数的函数

时间:2015-02-14 02:30:05

标签: c# xml linq

这是我事先提出的​​问题的扩展

我有一个我想要运行的特定功能,它位于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”

使用我自己的代码的示例: enter image description here

玩家类:

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);

有没有这样做?

1 个答案:

答案 0 :(得分:0)

Type player = Type.GetType("Player");

Type player = Type.GetType("myNamespace.Player");

See here for more info

然后你将不得不获得该类型的实例,请参阅操作类型。然后,您需要获取该类型的PropertyInfo,然后为Instance对象获取您想要的Instance等。

您需要深入了解告诉编译器您使用的对象以及要访问的属性。 Reflection是一种访问对象的运行时编译方式。它绝对比一般的计划更复杂。