2010-09-22 28 views
17

Belirli bir sırada aramak istediğim bir yöntem listesi var. Bu nedenle, bunları ya sıralı bir listede ya da belirtilen bir dizine sahip bir tabloda saklamak istiyorum. Bu sayede liste, çağrı sırasını değiştirmek istediğimiz günü değiştirecek tek şey olurdu.C# içinde yöntemlerin bir listesini saklama C#

Bir dizi ve delege kullanarak nasıl yapılacağını açıklayan this article buldum. Ama yorumlarda ve diğer yerlerde de bir Sözlük ve ya LinQ kullanarak da yapılabildiğini okudum. Herhangi bir tavsiyen var mı?

cevap

34

void döndüren parametresiz delegeler olan Action nesnelerini tanımlayabilirsiniz. Her eylem bir yöntemin işaretçisidir.

// Declare the list 
List<Action> actions = new List<Action>(); 

// Add two delegates to the list that point to 'SomeMethod' and 'SomeMethod2' 
actions.Add(()=> SomeClass.SomeMethod(param1)); 
actions.Add(()=> OtherClass.SomeMethod2()); 

// Later on, you can walk through these pointers 
foreach(var action in actions) 
    // And execute the method 
    action.Invoke(); 
+13

Invoke() btw'yi çıkartabilirsiniz, yalnızca eylemi çağırın() – testalino

+1

Her şey yolundadır, ancak Sıra OP'nin görevi yerine çok daha uygundur. List, imo. Öyle değil mi? – abatishchev

+2

Düşünme. Dinamik bir şekilde değişmeyecekleri için, sadece statik bir liste, sıraya gerek duyma veya görevleri kaldırma gerekliliği yok. Partiyi birkaç kez tekrar çalıştırmak isteyebilir. –

3

Neden bunu FIFO, Queue mağaza delegeler var bir Queue kullanarak düşünmüyoruz ve Dequeue çağırdığınızda onu belirli bir şekilde yöntemlerinizi arayacak.

Çok Noktaya Yayın Temsilcisi'ni kullanma hakkında, sözcüleri bir LinkList'te depolar, böylece Invoke() işlevini çağırdığınızda, belirtilen bir şekilde çağrılır.

7

Queue<Action> nasıl olur?

var queue = new Queue<Action>(); 

queue.Enqueue(() => foo()); 
queue.Enqueue(() => bar()); 

while(queue.Count != 0) 
{ 
    Action action = queue.Dequeue(); 
    action(); 
} 
0

Oldukça iyi ihtiyacını uyabilecek hangi List<> kullanabilirsiniz: sizin temsilci hükümsüz döndüren

delegate void MyFunction(...); 
List<MyFunction> delegateList; 

varsa, event kullanabilirsiniz. Birden fazla delege tek bir olay çağırma listesine eklenebilir ve eklendikleri sırayla çağrılabilir.

Dictionaryorder is undefined ve bir arama yapmak için pinti.