如何优化下面的代码,要求是从对象初始化事件中的xml读取配置。
try
{
var XMLInput = (XDocument.Load(cmdParameters["Profile"].ToString()).Descendants("Profile")
.Select(profile => new Profile
{
Server = profile.Element("Server").Value,
Publication = Convert.ToInt32(profile.Element("Publication").Value)
})).Single();
this.ServerName = XMLInput.Server;
this.NumberOfPublications = XMLInput.Publication;
}
catch (Exception)
{
Logger.Log(string.Format("Unable to load the Profile : {0}", cmdParameters["Profile"].ToString()));
}
如何直接将值加载到当前对象(this)中,而不是创建临时对象和加载。
答案 0 :(得分:2)
您不必创建新的Profile对象。您可以直接从XElement
对象获取属性值,如下所示:
var xElement = (XDocument.Load(cmdParameters["Profile"].ToString())
.Descendants("Profile").Single();
this.ServerName = xElement.Element("Server").Value;
this.NumberOfPublications = Convert.ToInt32(xElement.Element("Publication").Value);
请注意,此代码假定xElement对象永远不会为null。如果情况并非如此,您可能希望将Single()
替换为SingleOrDefault()
,并在分配值之前检查对象是否为空。
答案 1 :(得分:1)
您不必创建临时Profile
对象,并直接从XElement
获取所需的值,如另一个答案中所述。除此之外,您可以直接将XElement
投射到int
或其他类型* - 以获取int
类型中元素的值:
var profile = XDocument.Load(cmdParameters["Profile"].ToString())
.Descendants("Profile")
.Single();
this.ServerName = (string)profile.Element("Server");
this.NumberOfPublications = (int)profile.Element("Publication");
* :XElement
的可能明确转化列表:XElement Explicit Conversion Operators