2013-03-06 37 views
2

可以说我有一个item,它具有字段(属性)在哪里存储将在我的应用程序中使用常量对象

  1. 位置
  2. 平均值
  3. 可用性

我有10-15个items,我想要预定义它的值,或者写在某个地方,然后加载到要使用的代码中。

这将是它的最佳做法?

编辑: 这将是常数,只启动参数,它不会在应用程序生命周期进行修改。

+1

你需要更具体。最终用户是否可以更改这些值?你需要修改并保存它们吗?或者它会始终是相同的值? – 2013-03-06 20:21:26

+0

@HighCore:看我的编辑。 – Jaanus 2013-03-06 20:26:38

+0

查看我的回复=) – 2013-03-06 20:33:15

回答

2

可序列化和使用这个辅助类反序列化List<Item>并从一个XML文件:

public static class XmlHelper 
{ 
    // Specifies whether XML attributes each appear on their own line 
    const bool newLineOnAttributes = false; 

    public static bool NewLineOnAttributes { get; set; } 
    /// <summary> 
    /// Serializes an object to an XML string, using the specified namespaces. 
    /// </summary> 
    public static string ToXml(object obj, XmlSerializerNamespaces ns) 
    { 
     Type T = obj.GetType(); 

     var xs = new XmlSerializer(T); 
     var ws = new XmlWriterSettings { Indent = true, NewLineOnAttributes = newLineOnAttributes, OmitXmlDeclaration = true }; 

     var sb = new StringBuilder(); 
     using (XmlWriter writer = XmlWriter.Create(sb, ws)) 
     { 
      xs.Serialize(writer, obj, ns); 
     } 
     return sb.ToString(); 
    } 

    /// <summary> 
    /// Serializes an object to an XML string. 
    /// </summary> 
    public static string ToXml(object obj) 
    { 
     var ns = new XmlSerializerNamespaces(); 
     ns.Add("", ""); 
     return ToXml(obj, ns); 
    } 

    /// <summary> 
    /// Deserializes an object from an XML string. 
    /// </summary> 
    public static T FromXml<T>(string xml) 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(T)); 
     using (StringReader sr = new StringReader(xml)) 
     { 
      return (T)xs.Deserialize(sr); 
     } 
    } 

    /// <summary> 
    /// Serializes an object to an XML file. 
    /// </summary> 
    public static void ToXmlFile(Object obj, string filePath) 
    { 
     var xs = new XmlSerializer(obj.GetType()); 
     var ns = new XmlSerializerNamespaces(); 
     var ws = new XmlWriterSettings { Indent = true, NewLineOnAttributes = NewLineOnAttributes, OmitXmlDeclaration = true }; 
     ns.Add("", ""); 

     using (XmlWriter writer = XmlWriter.Create(filePath, ws)) 
     { 
      xs.Serialize(writer, obj); 
     } 
    } 

    /// <summary> 
    /// Deserializes an object from an XML file. 
    /// </summary> 
    public static T FromXmlFile<T>(string filePath) 
    { 
     StreamReader sr = new StreamReader(filePath); 
     try 
     { 
      var result = FromXml<T>(sr.ReadToEnd()); 
      return result; 
     } 
     catch (Exception e) 
     { 
      throw new Exception(e.InnerException.Message); 
     } 
     finally 
     { 
      sr.Close(); 
     } 
    } 
} 

用法:

XmlHelper.ToXmlFile(myList, @"c:\folder\file.xml"); 

var list = XmlHelper.FromXmlFile<List<Item>>(@"c:\folder\file.xml"); 
2

你的选择将是:

  1. XML - 你的标签之一其实
  2. 数据库
  3. 二进制文件

存储中的对象并在代码的阅读。

编写XML代码,例如:

public void WriteXML() 
{ 
    Book overview = new Book(); 
    overview.title = "Serialization Overview"; 
    System.Xml.Serialization.XmlSerializer writer = 
     new System.Xml.Serialization.XmlSerializer(typeof(Book)); 

    System.IO.StreamWriter file = new System.IO.StreamWriter(
     @"c:\temp\SerializationOverview.xml"); 
    writer.Serialize(file, overview); 
    file.Close(); 
} 

读取XML的代码示例:

public void Read(string fileName) 
{ 
    XDocument doc = XDocument.Load(fileName); 

    foreach (XElement el in doc.Root.Elements()) 
    { 
     Console.WriteLine("{0} {1}", el.Name, el.Attribute("id").Value); 
     Console.WriteLine(" Attributes:"); 
     foreach (XAttribute attr in el.Attributes()) 
      Console.WriteLine(" {0}", attr); 
     Console.WriteLine(" Elements:"); 

     foreach (XElement element in el.Elements()) 
      Console.WriteLine(" {0}: {1}", element.Name, element.Value); 
    } 
} 
+0

第一个选项是最可以接受的,这就是为什么标签,原因是在同一个方向思考,那么在'* .cs'文件中用setter创建它们并将它们添加到某种全局静态集合中呢? – Jaanus 2013-03-06 20:27:44

+0

你可以使用项目类中的静态对象,但是,如果你想稍后添加另一个项目,你将不得不重新编译(重建)整个项目?如果项目假设被其他人使用,这不会是一个好建议:) – Mortalus 2013-03-06 20:29:10

+0

虽然这是可行的选项,但它们都不是最适合这种情况的选项。一个数据库似乎并不是“CONSTANT”数据的最佳位置。 XML需要将XML文件存储在已部署的二进制文件的某个位置,并且还需要启动时间才能加载。二进制文件相同。 – 2013-03-06 20:29:29

0

什么你所描述的一样完美的使用情况下的声音为T4

你可以添加一个T4模板项目,它读取XML数据(在设计时Visual Studio中),并生成*的.cs文件与您的静态内容。如果您需要修改数据,只需修改XML文件并单击解决方案资源管理器中的Transform All Templates按钮即可。

请记住,这将要求您重新编译和重新部署应用程序,如果你需要修改这些内容。如果是这种情况,那么@Mortalus提供的解决方案是最好的选择。

1

ApplicationSettings将是一个很好的适合启动常量。

+1

我相信这对复杂的物体并不好。如我错了请纠正我。 – Jaanus 2013-03-06 21:07:12

+0

您可以将其序列化为一个字符串,或者为每个项目的字段创建单独的属性并从中构建它们。 – 2013-03-06 21:57:49

0

我会用web.config中并存储在这个应用程序设置区域,然后创建一个类,将阅读这些检索它作为一个列表。

这里是如何可能看起来在web配置和C#代码。

<appSettings>  
    <add key="location_1" value="123"/> 
    <add key="avgValue_1" value="123"/> 
    <add key="usability_1" value="123"/> 
    <add key="location_2" value="123"/> 
    <add key="avgValue_2" value="123"/> 
    <add key="usability_2" value="123"/> 
    <add key="count" value="2"/> 
</appSettings> 

public class SomeClass 
{ 
private string location; 
private double avgValue; 
private int usability; 

public string Location 
{ 
    get { return location; } 
    set { location = value; } 
} 
public double AvgValue 
{ 
    get { return avgValue; } 
    set { avgValue = value; } 
} 
public int Usability 
{ 
    get { return usability; } 
    set { usability = value; } 
} 
} 

public class Config 
{ 
public static List<SomeClass> Items 
{ 
    get 
    { 
     List<SomeClass> result = new List<SomeClass>(); 

     for (int i = 1; i <= Convert.ToInt32(WebConfigurationManager.AppSettings["count"]); i++) 
     { 
      SomeClass sClass = new SomeClass(); 
      sClass.AvgValue = Convert.ToDouble(WebConfigurationManager.AppSettings["avgValue_" + i.ToString()]); 
      sClass.Location = WebConfigurationManager.AppSettings["location_" + i.ToString()]; 
      sClass.Usability = Convert.ToInt32(WebConfigurationManager.AppSettings["usability_" + i.ToString()]); 
     } 

     return result; 
    } 
} 

}

相关问题