Почему я не могу вызвать Delegate.CreateDelegate в моей переносимой библиотеке классов?
У меня следующая проблема: хочу позвонитьDelegate.CreateDelegate
из моей Портативной библиотеки классов, предназначенной для приложений .NET 4.5, Windows Phone 8 и Windows 8 Store, но мой код не компилируется. Компилятор говорит, что не может найти метод наDelegate
тип.
Самое смешное, что, например, библиотека PRISM от Microsoft может вызывать «Delegate.CreateDelegate» из переносимой библиотеки классов. Это происходит вDelegateReference
класс. Портативная библиотека классов PRISM предназначена для .NET 4.0, приложений для Магазина Windows 8, Windows Phone 8 и Silverlight 5 (и, следовательно, для еще более ограничительного набора).
Код, который не компилируется, выглядит так:
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);
Пример можно скачать здесь:https://dl.dropboxusercontent.com/u/14810011/PortableClassLibraryReferenceProblem.zip
Он содержит мой библиотечный проект и очень упрощенную версию проекта PRISM PubSubEvents, содержащую толькоDelegateReference
класс и его интерфейс. Полный исходный код последнего можно найти здесь:http://prismwindowsruntime.codeplex.com/SourceControl/latest
Что я могу сделать, чтобы использовать всеDelegate
Члены? Заранее спасибо за вашу помощь!
РЕДАКТИРОВАТЬ после ответа Хенка Холтермана:
GetMethodInfo () - это метод расширения, который поддерживается подмножеством PCL. Во всяком случае, это не связано с проблемой, которую я не могу назватьDelegate.CreateDelegate
в то время как проект PRISM PCL может.
РЕДАКТИРОВАТЬ 2 после комментария Ганса Пассанта:
Я просто поиграл и обнаружил, что когда я активирую Silverlight 5 в качестве цели переносимой библиотеки, тоDelegate.CreateDelegate
действительно доступен (и метод расширения GetMethodInfo больше не существует). ЯвляетсяDelegate.CreateDelegate
тогда может быть сопоставлен с другим API для Windows 8 Store и приложений для телефона внутри? Это единственный способ, которым я мог придумать, как этот метод будет внезапно доступен только потому, что я добавил Silverlight 5 в качестве допустимой цели.
(Вы можете воспроизвести это, щелкнув правой кнопкой мыши на проекте «MyPortableClassLibrary», выберите «Свойства» и на вкладке «Библиотека» нажмите кнопку «Изменить», чтобы выбрать платформы, на которые ориентирована переносная библиотека.)
Кроме того, ранее сегодня я создал проект Windows Store App и увидел, что не былоCreateDelegate
метод, определенный наDelegate
класс в .NET для Windows Runtime.
В моем реальном проекте я не хочу ориентироваться на Silverlight 5, поскольку я используюIObservable<T>
а такжеIObserver<T>
интенсивно использующий Rx, и эти интерфейсы не определены в Silverlight.