向Func添加方法

时间:2015-01-28 11:14:11

标签: c# list func

我有一个Func列表,我想添加元素。 如果我在Start上添加它们,如下所示,没问题:

        public List<System.Func<bool>> conditions = new List<System.Func<bool>>();

        void Start()
        {
        conditions.Add(Iamdead);
        conditions.Add(Iamalive);
        }

        bool Iamdead()
        {
        ...
        return ...;
        }
        bool Iamalive()
        {
        ...
        return ...;
        }

但我想在没有Start的情况下定义列表,以便我有一个干净的方法列表,我可以将其视为连续的元素。我尝试过经典格式:

public List<System.Func<bool>> conditions = new List<System.Func<bool>>()
{
        bool Iamdead()
        {
        ...
        return ...;
        }
        ,
        bool Iamalive()
        {
        ...
        return ...;
        }
};

这给了我解析错误

我尝试过这样:

public List<System.Func<bool>> conditions = new List<System.Func<bool>>()
    {
Iamdead,Iamalive
    };

        static bool Iamdead()
        {
        ...
        return ...;
        }
        static bool Iamalive()
        {
        ...
        return ...;
        }

只有当方法是静态的但我不希望它们是静态的时,这才起作用。没有静态,它不起作用。我似乎无法理解这里的数据结构。谁能告诉我在列表中定义Func的正确方法?

由于

3 个答案:

答案 0 :(得分:7)

我强烈怀疑问题是您在字段初始值设定项中尝试访问this(隐式)。你不被允许这样做。只需将初始化移动到构造函数中:

// You don't really use public fields, do you?
private readonly List<Func<bool>> conditions;

public MyClass()
{
    conditions = new List<Func<bool>> { Method1, Method2 };
}

private bool Method1() { ... }
private bool Method2() { ... }

(我假设你实际希望你的条件依赖于实例中的状态。如果他们没有,你不需要this。如果方法不是'除了这些条件以外,它们使用的时间很短,你可能想要使用lambda表达式。)

答案 1 :(得分:1)

像这样:

    public List<System.Func<bool>> conditions = new List<System.Func<bool>>()
                                                    {
                                                        () => false,
                                                        () => true,
                                                    };

答案 2 :(得分:0)

你可以使用lambdas:

public List<System.Func<bool>> conditions = new List<System.Func<bool>>()
{
    () =>
    {
        return false;
    }
    ,
    () =>
    {
        return true;
    }
};