匿名对象列表?

时间:2015-04-11 17:50:36

标签: c# list anonymous-types

我有一个使用List类的类。在尝试设置Add函数以添加我的匿名类型时,我得到的只是错误。

我一直在寻找几个小时,而且我能说的最好,我见过的每个例子都在做同样的事情。所以我不明白什么是错的。

class fileHistory<Object> : List<Object>
{
    public new void Add(DateTime ts, int st)
    {
        base.Add( new { timeStamp = ts; status = st;} );
    }
}

3 个答案:

答案 0 :(得分:1)

您的类定义中不需要通用声明,还需要将分号更改为逗号:

public class fileHistory : List<Object>
{
    public new void Add(DateTime ts, int st)
    {
        base.Add( new { timeStamp = ts, status = st} );
    }
}

答案 1 :(得分:1)

是的,你可以覆盖(不是多态!检查我用覆盖而不是覆盖List<T>.Add(T)方法,但我相信你可以解决使用合成而不是继承来解决您的问题,您的代码将完美运行:

class fileHistory
{
    private readonly List<object> _log = new List<object>();

    public void Add(DateTime ts, int st)
    {
         _log.Add( new { timeStamp = ts; status = st;} );
    }
}
顺便说一下,我看到了三个设计缺陷:

  1. 匿名类型不适用于您的用例。如果你要添加具有这两个属性的对象并且你在像你这样的具体用例中进行,也许你正在使用匿名类型,因为你设计一个具有2个属性的类的懒惰? ;)

  2. 由于#1,为什么要使用通用列表创建objects列表?它打败了仿制药的全部目的!!

  3. 我发现隐藏Add List<T>的错误设计决定。在这些情况下使用组合而不是继承。此外,当C#支持方法重载时,我不知道您为何使用new关键字重新使用标识符。在List<T>中,您的输入参数没有超出Add ...

  4. 我的建议是:由于使用C#提供的花哨的语法糖,代码并不比较漂亮。有时你不需要它,老实说,我相信情况就是这样。

    对于那些担心LINQ ......

    的人

    任何类可能会也可能不会实现IEnumerable<T>。整个fileHistory类可以使用foreach或LINQ及其实现IEnumerable<T>的扩展方法进行迭代:

    // Check that I dropped the lazy approach of using 
    // anonymous types!!
    class fileHistory : IEnumerable<FileLog>
    {
        private readonly List<FileLog> _log = new List<FileLog>();
    
        public IEnumerator<FileLog> GetEnumerator() 
        {
             return _log.GetEnumerator();
        }
    
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return _log.GetEnumerator();
        }
    
        public void Add(DateTime ts, int st)
        {
             _log.Add(new FileLog { timeStamp = ts; status = st;} );
        }
    }
    

    ...现在,即使使用合成而不是继承,也可以迭代这样的类:

    new fileHistory().Where(log => log.DateTime < DateTime.Now);
    

答案 2 :(得分:0)

class fileHistory<Object> : List<Object>
{
    public new void Add(DateTime ts, int st)
    {
        // That's how it's supposed to be
        base.Add(new { timeStamp = ts, status = st });
    }
}

希望我帮助过!