在setter中检索XML

时间:2010-11-04 13:51:47

标签: c# xml properties

我有一个包含几个项目的对象:

public class ObjectT{
  public int ValueA{
    get
    set;
  }

  public string ValueB{
    get;set;
  }

  public int Description{
    get{
      XDocument doc = XDocument.Load(@"xmldocument.xml");
      return (string)doc.Elements("test").Single(t => t.Element(ValueB).Value);
  }
}

Linq可能并不完美,但是,你会明白的。我正在根据类中的其他属性从xml中读取描述。但是,我不喜欢我必须一直从xml中读取。想象一下,我想制作1000个这些对象,其中有100个不同的Description值。我必须对XML文件进行1000次读取。

有更好(更快)的方法吗?

用例

我想做的是以下

ObjectT t = new ObjectT();
t.ValueA = 1;
string test = t.Description;

ObjectT t1 = new ObjectT;
t.ValueA = 2;
string test2 = t.Description;

...

所以我想将IO减少到xml,因为我想创建一个对象加载。

4 个答案:

答案 0 :(得分:2)

有些事情会浮现在脑海中:

  • 要减少IO,请在初始化类时读取XML文件一次。
  • 创建Dictionary<string,int>以保存每个描述值的值,并将其用作缓存。

XDocument doc;
Dictionary<string,int> dict;

public myObject()
{
  doc = XDocument.Load(@"xmldocument.xml");
  dict = new Dictionary<string,int>();
}

public int Description{
 get{
  if(!dict.ContainsKey(ValueB))
    dict.Add( ValueB, 
              (int)doc.Elements("test").Single(t => t.Element(ValueB).Value));

  return dict[ValueB];
  }
}

答案 1 :(得分:1)

您说您希望拥有数千个从此XML文档中读取的对象。但是你不想一遍又一遍地重新加载那个XML文档。

因此,围绕该XML文档编写一个静态包装类,将其加载一次。提供一个检索所需值的方法,并从XML文档的内存缓存中读取数据。

然后,您的ObjectT.Description属性将调用该方法来获取数据。由于包装类是静态的,因此只创建它的一个实例,并且ObjectT的所有实例都将使用它。此外,XML文档仅加载一次。

答案 2 :(得分:0)

你不能这样做吗

public class Object{

static XDocument doc;
static LoadXml()
{
    doc = XDocument.Load(@"xmldocument.xml");
}

  public int ValueA{
    get
    set;
  }

  public string ValueB{
    get;set;
  }

  public int Description{
    get{
      return (string)doc.Elements("test").Single(t => t.Element(ValueB).Value);
  }
}

答案 3 :(得分:0)

至少可以在创建对象时保持文档的加载。