可以说我有一个item
,它具有字段(属性)在哪里存储将在我的应用程序中使用常量对象
- 位置
- 平均值
- 可用性
我有10-15个items
,我想要预定义它的值,或者写在某个地方,然后加载到要使用的代码中。
这将是它的最佳做法?
编辑: 这将是常数,只启动参数,它不会在应用程序生命周期进行修改。
可以说我有一个item
,它具有字段(属性)在哪里存储将在我的应用程序中使用常量对象
我有10-15个items
,我想要预定义它的值,或者写在某个地方,然后加载到要使用的代码中。
这将是它的最佳做法?
编辑: 这将是常数,只启动参数,它不会在应用程序生命周期进行修改。
可序列化和使用这个辅助类反序列化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");
你的选择将是:
存储中的对象并在代码的阅读。
编写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);
}
}
第一个选项是最可以接受的,这就是为什么标签,原因是在同一个方向思考,那么在'* .cs'文件中用setter创建它们并将它们添加到某种全局静态集合中呢? – Jaanus 2013-03-06 20:27:44
你可以使用项目类中的静态对象,但是,如果你想稍后添加另一个项目,你将不得不重新编译(重建)整个项目?如果项目假设被其他人使用,这不会是一个好建议:) – Mortalus 2013-03-06 20:29:10
虽然这是可行的选项,但它们都不是最适合这种情况的选项。一个数据库似乎并不是“CONSTANT”数据的最佳位置。 XML需要将XML文件存储在已部署的二进制文件的某个位置,并且还需要启动时间才能加载。二进制文件相同。 – 2013-03-06 20:29:29
什么你所描述的一样完美的使用情况下的声音为T4
你可以添加一个T4模板项目,它读取XML数据(在设计时Visual Studio中),并生成*的.cs文件与您的静态内容。如果您需要修改数据,只需修改XML文件并单击解决方案资源管理器中的Transform All Templates
按钮即可。
请记住,这将要求您重新编译和重新部署应用程序,如果你需要修改这些内容。如果是这种情况,那么@Mortalus提供的解决方案是最好的选择。
ApplicationSettings将是一个很好的适合启动常量。
我相信这对复杂的物体并不好。如我错了请纠正我。 – Jaanus 2013-03-06 21:07:12
您可以将其序列化为一个字符串,或者为每个项目的字段创建单独的属性并从中构建它们。 – 2013-03-06 21:57:49
我会用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;
}
}
}
你需要更具体。最终用户是否可以更改这些值?你需要修改并保存它们吗?或者它会始终是相同的值? – 2013-03-06 20:21:26
@HighCore:看我的编辑。 – Jaanus 2013-03-06 20:26:38
查看我的回复=) – 2013-03-06 20:33:15