是否有 ExpandoObject
的初始化语法,我可以在 LINQ to XML 查询中使用它以实现简洁目的?
注意:查询的结果旨在传递到当前程序集的范围之外,因此匿名类型是不可能的 (see why here)。
我正在尝试使用像下面这样的简短语法来创建动态/扩展对象:
public IEnumerable<dynamic> ParseUserXml(string strXmlUser) {
var qClients =
from client in xdoc.Root.Element(XKey.clients).Elements(XKey.client)
// client object
// I cannot get ExpandoObject to initialize inline
select new ExpandoObject() { // try initialization syntax, COMPILE ERR
OnlineDetails = new
{
Password = client.Element(XKey.onlineDetails).
Element(XKey.password).Value,
Roles = client.Element(XKey.onlineDetails).
Element(XKey.roles).Elements(XKey.roleId).
Select(xroleid => xroleid.Value)
// More online detail fields TBD
},
// etc ....
// YIELD DYNAMIC OBJECTS BACK THROUGH IEnumerable<dynamic>...
foreach (var client in qClients)
{
yield return client;
}
使此代码正常工作的更复杂的解决方案可能是:
- 创建具体类并将其初始化(但我不想创建一堆这样的类)。
- 使用匿名类型并将其成员复制到动态对象(有点多余)并返回动态对象
是否有同样短的语法来实现我打算通过有问题的错误代码执行的操作,或者我是否必须以某种方式扩展代码库以获得所需的结果?
最佳答案
很遗憾,我认为您无法做到这一点。您可以做的是创建一个辅助方法并调用它。
var qClients =
from client in xdoc.Root.Element(XKey.clients).Elements(XKey.client)
// client object
select ClientXmlToExpandoObject(client);
助手可能看起来像
public dynamic ClientXmlToExpandoObject(System.Xml.Linq.XElement client)
{
dynamic result = new ExpandoObject();
result.OnlineDetails = new
{
Password = client.Element(XKey.onlineDetails).
Element(XKey.password).Value,
Roles = client.Element(XKey.onlineDetails).
Element(XKey.roles).Elements(XKey.roleId).
Select(xroleid => xroleid.Value)
// More online detail fields TBD
};
return result;
}
关于c# - 实现动态对象从LINQ to XML select查询的捷径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5159433/