Dlaczego nie mogę zadzwonić do Delegate.CreateDelegate w mojej przenośnej bibliotece klas?
Mam następujący problem: chcę zadzwonićDelegate.CreateDelegate
z mojej przenośnej biblioteki klas ukierunkowanej na aplikacje .NET 4.5, Windows Phone 8 i Windows 8 Store, ale mój kod się nie kompiluje. Kompilator mówi, że nie może znaleźć metody naDelegate
rodzaj.
Zabawne jest to, że np. biblioteka PRISM firmy Microsoft może wywoływać „Delegate.CreateDelegate” z przenośnej biblioteki klas. Robi to wDelegateReference
klasa. Przenośna biblioteka klasy PRISM jest przeznaczona dla aplikacji .NET 4.0, Windows 8 Store Apps, Windows Phone 8 i Silverlight 5 (i tym samym jeszcze bardziej restrykcyjny zestaw).
Kod, który się nie kompiluje, wygląda tak:
public class MyClass
{
public void MyMethod<T>(EventHandler handler)
{
var @delegate = Delegate.CreateDelegate(typeof (OpenEventHandler<T>), null, handler.GetMethodInfo());
}
}
public delegate void OpenEventHandler<in T>(T target, object sender, EventArgs arguments);
Przykład można pobrać tutaj:https://dl.dropboxusercontent.com/u/14810011/PortableClassLibraryReferenceProblem.zip
Zawiera mój projekt biblioteczny i bardzo uproszczoną wersję projektu PRISM PubSubEvents zawierającego tylkoDelegateReference
klasa i jej interfejs. Pełny kod źródłowy tego ostatniego można znaleźć tutaj:http://prismwindowsruntime.codeplex.com/SourceControl/latest
Co mogę zrobić, aby korzystać ze wszystkichDelegate
członkowie? Z góry dziękuję za pomoc!
EDYTOWAĆ po odpowiedzi Henka Holtermana:
GetMethodInfo () to metoda rozszerzenia obsługiwana przez podzbiór PCL. W każdym razie nie jest to związane z problemem, którego nie mogę wywołaćDelegate.CreateDelegate
podczas gdy projekt PCL PRISM może.
EDYCJA 2 po komentarzu Hansa Passanta:
Właśnie się bawiłem i dowiedziałem się, kiedy aktywuję Silverlight 5 jako cel przenośnej bibliotekiDelegate.CreateDelegate
jest rzeczywiście dostępny (a metoda rozszerzenia GetMethodInfo już nie jest). JestDelegate.CreateDelegate
następnie może zostać wewnętrznie zmapowany do innego API dla aplikacji Windows 8 Store and Phone? To jedyny sposób, w jaki mogłem pomyśleć o tym, jak ta metoda byłaby nagle dostępna tylko dlatego, że dodałem Silverlight 5 jako prawidłowy cel.
(Można to odtworzyć, klikając prawym przyciskiem myszy projekt „MyPortableClassLibrary”, klikając polecenie „Właściwości”, a następnie na karcie „Biblioteka” kliknij przycisk Zmień, aby wybrać struktury, na które kieruje przenośna biblioteka).
Również wcześniej stworzyłem projekt aplikacji Windows Store i zobaczyłem, że nie maCreateDelegate
metoda zdefiniowana naDelegate
klasa w .NET dla Windows Runtime.
W moim rzeczywistym projekcie nie chcę kierować na Silverlight 5 w miarę używaniaIObservable<T>
iIObserver<T>
mocno używa Rx i te interfejsy nie są zdefiniowane w Silverlight.