У меня есть следующая проблема: я хочу вызвать Delegate.CreateDelegate
из моей библиотеки Portable Class Library, ориентированной на .NET 4.5, Windows Phone 8 и Windows 8 Store Apps, но мой код не компилируется. Компилятор говорит, что он не может найти метод в типе Delegate
.
Самое забавное, что, например, библиотека PRISM от Microsoft может вызвать "Delegate.CreateDelegate" из портативной библиотеки классов. Он делает это в классе DelegateReference
. Портативная библиотека классов PRISM предназначена для .NET 4.0, Windows 8 Store Apps, 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 может.
EDIT 2 после комментария Hans Passants:
Я только что поиграл и узнал, что когда я активирую Silverlight 5 как цель переносимой библиотеки, тогда Delegate.CreateDelegate
действительно доступен (и метод расширения GetMethodInfo больше не существует). Является ли Delegate.CreateDelegate
, а может быть, сопоставлен с другим API для приложений Windows 8 Store и Phone внутри? Это единственный способ, которым я мог бы думать о том, как этот метод будет внезапно доступен только потому, что я добавил Silverlight 5 в качестве действительной цели.
(Вы можете воспроизвести это, щелкнув правой кнопкой мыши по проекту "MyPortableClassLibrary", нажмите "Свойства" и на вкладке "Библиотека" нажмите "Изменить", чтобы выбрать рамки, на которые нацелена переносная библиотека.)
Кроме того, ранее сегодня я создал проект приложения Windows Store и увидел, что не существует метода CreateDelegate
, определенного в классе Delegate
в .NET для Windows Runtime.
В моем фактическом проекте я не хочу указывать Silverlight 5, поскольку я использую IObservable<T>
и IObserver<T>
сильно используя Rx, и эти интерфейсы не определены в Silverlight.