使用多个命令在类中预定义字段

时间:2016-08-03 11:51:23

标签: c# attributes command predefined-variables

假设我有一个带有构造函数的类,该构造函数用两个条目填充内部列表:

class MyClass
{
    IList<int> someList;

    public MyClass()
    {
        someList = new List<int>();
        someList.Add(2);
        someList.Add(4);

        ... // do some other stuff
    }
}

现在假设我有几个构造函数,它们都与内部列表相同(但在其他方面有所不同)。

我想知道我是否可以将列表的生成和填充直接外包给该字段,如下所示:

class MyClass
{
    IList<int> someList = new List<int>(); someList.Add(2); someList.Add(4);
    // Does not compile.

    public MyClass()
    {
        ... // do some other stuff
    }
}

是否可以在字段定义中调用多个命令,如果是,可以如何调用?

2 个答案:

答案 0 :(得分:1)

您可以像这样预先实例化IList,并在每次访问索引器时添加您的值:

IList<int> someList = new List<int>() { 2, 4 };

这将是在使用构造函数之前进行的初始化。

更新1

正如评论中提到的OP,对于LinkedList<T>(),您必须使用带有IEnumarable的构造函数(在我的示例中为数组)。

LinkedList<int> myList1 = new LinkedList<int>(new int[] {2,3,4});

更新2

在阅读完您的上一条评论后,您在实例化过程中正在寻找Fluent Interfaces。这是一种将函数链接在一起的方法,看起来像这样:

Customer c1 = new Customer()  
                  .FirstName("matt")
                  .LastName("lastname")
                  .Sex("male")
                  .Address("austria");

默认情况下,Collection Classes中不提供此功能。您必须为此实现自己的IList<T>版本。

Lambda Expression是实现此目的的一种方式,就像您的更新显示...

答案 1 :(得分:1)

知道了:

IList<int> someList = new Func<List<int>>(() => { IList<int> l = new List<int>(); l.Add(2); l.Add(4); return l; })();

说明:

() => { IList<int> l = new List<int>(); l.Add(2); l.Add(4); return l; }

是一个不带参数且返回IList<int>的函数,因此它是Func<IList<int>>

虽然编译器知道这一点,但我似乎必须通过

明确说明这一事实
new Func<IList<int>>(...)

以后可以调用它。通过在()后放置两个括号Func来完成调用。

或者以更易读的方式编写它(然后我甚至不需要new关键字,而是必须使Func静态化:

static Func<IList<int>> foo = () => { IList<int> l = new List<int>(); l.Add(2); l.Add(4); return l; };

IList<int> someList = foo();