1

我写了一个返回的查询IEnumerable<Item>,其中Item类有几个不同的成员:

public class Item
{
    public string Name { get; private set; }
    public string Type { get; private set; }

    public IEnumerable<Property> Properties;
    public IEnumerable<Item> Items;

    public Item(XElement itemElement)
    {
        Name = itemElement.Attribute("name").Value;
        Type = itemElement.Attribute("type").Value;
        Properties = from property in itemElement.Elements("Property")
                     select new Property(property);

        Items = from item in itemElement.Elements("Item")
                select new Item(item);
    }
}

我不喜欢 LINQPad 选择的将Item属性分配给结果表中的列的顺序。我希望列以Name, Type, Properties,的顺序出现Items,但 LINQPad 默认显示为Properties, Items, Name, Type。有没有办法提示 LINQPad 属性列的顺序应该是什么?

4

2 回答 2

7

我仍然想知道在我不控制 IEnumerable<FooObject>.

如果您可以更改您的 Item 类,您可以通过实现 ICustomMemberProvider 来做到这一点(请参阅http://www.linqpad.net/FAQ.aspx#extensibility

例如

public class Item : LINQPad.ICustomMemberProvider
{

    ...

    IEnumerable<string> ICustomMemberProvider.GetNames() 
    {
        return new [] { "Name", "Type", "Properties", "Items" };
    }

    IEnumerable<Type> ICustomMemberProvider.GetTypes ()
    {
        return new [] { typeof (string),  typeof(string) , typeof(IEnumerable<Item>), typeof(IEnumerable<Property>) };
    }

    IEnumerable<object> ICustomMemberProvider.GetValues ()
    {
        return new object [] { this.Name, this.Type, this.Properties, this.Items };
    }                           
}
于 2013-04-24T11:45:24.723 回答
0

问题中描述的 LINQPad 排序顺序正在发生,因为 Name 和 Type 是 C# 对象属性,但 Properties 成员和 Items 成员实际上是 C# 对象字段。

默认情况下,LINQPad 似乎在属性之前显示对象字段。

我向 Properties 成员和 Items 成员添加了自动实现的属性:

    public string Name { get; private set; }
    public string Type { get; private set; }
    public IEnumerable<Property> Properties { get; private set; }
    public IEnumerable<Item> Items { get; private set; }

进行此更改后,LINQPad 列顺序与类中的成员声明顺序匹配,这正是我最初想要的。

但是,我将把这个问题留在这里并且不接受我自己的答案,因为我仍然想知道Dump()在我不控制IEnumerable<FooObject>.

于 2013-04-24T00:39:46.370 回答