2013-02-05 14 views
37

Bir WinRT uygulaması için birim testleri yazıyorum ve bu kullanarak zaman uyumsuz olmayan özel yöntemleri çağırmak mümkün duyuyorum: Söz konusu özel yöntem async ise, AncakWinRT'de yansımayı kullanarak çağrılan bir eşzamansız özel yöntem nasıl beklenir?

TheObjectClass theObject = new TheObjectClass(); 
Type objType = typeof(TheObjectClass); 
objType.GetTypeInfo() 
     .GetDeclaredMethod("ThePrivateMethod") 
     .Invoke(theObject, null); 

, kod yürütülmesine devam edecek bitirmek için beklemeden.

Nasıl bu kadar await işlevselliği eklerim?

+0

bu WinRT uygulaması olduğundan, özel üyelerin bu yansıma/çağırma izin verilmese his var. Şu anda google'da bunun resmi belgelerini bulamıyorum, en yakın olan: http://blogs.microsoft.co.il/blogs/sasha/archive/2011/09/17/metro-net-framework-profile-windows -tailored.aspx EDIT: Bunlar birim testleri olsa da, belki de bir sorun değil. :) –

+0

@Chris Sinclair Aslında, yukarıdaki kod, özel yöntemler için mükemmel çalışıyor. Sorunum, özellikle senkronize olmayanlarla. Konu, yansıma yoluyla da çağrılan kamu yöntemlerine de uygulanacaktı. – jokeefe

cevap

69

Iyi yöntemle döndürülen değeri kullanmak gerekir. Türünü biliyor musun? her zaman bir Task ise Örneğin, şunu kullanabilirsiniz:

await (dynamic) objType.GetTypeInfo() 
         .GetDeclaredMethod("ThePrivateMethod") 
         .Invoke(theObject, null); 

I:

await (Task) objType.GetTypeInfo() 
        .GetDeclaredMethod("ThePrivateMethod") 
        .Invoke(theObject, null); 

bunu awaitable olacak dönüş türü biliyorum ama bilmiyorsanız, dinamik yazarak kullanabilirsiniz Bununla birlikte, ünite testlerinde yansıma yaparak özel bir yöntemi çağırmaktan kaçınmak için 'u deneyin. Bunu dolaylı olarak halka açık (veya dahili) API ile test edebilir misiniz? Bu genellikle tercih edilir.

+0

Ancak, "GetAwaiter()", WinRT 'IAsyncAction' için geçerli olan bir uzantı yöntemidir. – svick

+0

@Jon Skeet: Teşekkürler! Bu yaptı. Döndürülmüş bir 'Görev' nesnesiydi, bu yüzden yapmam gereken tek şey onu hazırladı ve 'bekle' yi ekledi. Ayrıca, birim test yönteminin 'Görev' işlevini '' uyumsuz '' hale getirdiğinizde veya birim test çerçevesi çalışması tarafından yürütülmeyeceğini de belirledim. – jokeefe

+0

@Jeff: Getirdiğiniz derleyici hatası gibi daha fazla ayrıntı vermeniz size yardımcı olur. Bunun hakkında bir yorum tartışması yapmaktan ziyade yeni bir soru oluşturmaya değer olabilir. –

6

InvokeTask dönüştürülebilen bir nesne döndürmelidir. Sadece await bu.

Özel yönteminiz void döndürürse, o zaman dağınık olan bir özel SynchronizationContext gerekir. Yöntemlerinizin Task/Task<T> değerini döndürmesi daha iyidir.

İlgili konular