2015-01-28 2 views
0

У меня есть список Func, и я хочу добавить элементы. Если я не добавить их на старт, как показано ниже, не проблема:Добавить методы в Func

 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 в списке?

Благодаря

+0

Пожалуйста, приложить больше усилий в форматировании ваши сообщения. В настоящее время код * очень трудно прочитать. Кроме того, «это не работает» не дает никакой информации. –

+1

У вашего оригинального вопроса были методы, которые всегда возвращали 'true' или' false' (жестко закодированные)? Это, похоже, вызвало некоторую путаницу в ответах ... –

+0

Да, Func возвращает только true или false, но, конечно, методы Iamdead, Iamalive будут иметь свои собственные вычисления, кроме возвращающихся мертвыми, живыми – sonny

ответ

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 Если.. методы не используются, кроме этих условий, и они достаточно короткие, вы можете захотеть использовать лямбда-выражения, а)

+0

jon вы можете объяснить, пожалуйста, что сделал шип :) –

+0

@KamelBRAHIM: Спайк дал ответ, который использует лямбда-выражения, которые не зависят от 'this'. a) ответ не использует преобразования группы методов, что, по-видимому, требовал OP; б) даже используя лямбда-выражения, которые не смогут скомпилироваться, как только он обратится к состоянию внутри экземпляра. –

+0

спасибо, что это было важно для вашего подтверждения, так как мне кажется странным, что он делает с 2 upvote –

1

Как так:

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

Это не использует какое-либо состояние в пределах пример. Как только вы попытаетесь использовать выражение лямбда, которое использует состояние, это не скомпилируется. –

+0

Хорошая точка - спасибо –

0

вы можете просто использовать лямбды:.

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

Это не использует какое-либо состояние в экземпляре. Как только вы попытаетесь использовать выражение лямбда, которое * использует * состояние, это не скомпилируется. –

Смежные вопросы