¿Por qué no puedo llamar a Delegate.CreateDelegate en mi biblioteca portátil de clases?
Tengo el siguiente problema: quiero llamarDelegate.CreateDelegate
desde dentro de mi biblioteca portátil de clases que tiene como objetivo las aplicaciones de .NET 4.5, Windows Phone 8 y Windows 8 Store, pero mi código no se compila. El compilador dice que no puede encontrar el método en elDelegate
tipo.
Lo curioso es que, por ejemplo, La biblioteca PRISM de Microsoft puede llamar 'Delegate.CreateDelegate' desde una biblioteca de clases portátil. Lo hace en elDelegateReference
clase. La biblioteca de clases portátil PRISM se enfoca en .NET 4.0, Windows 8 Store Apps, Windows Phone 8 y Silverlight 5 (y, por lo tanto, un conjunto aún más restrictivo).
El código que no se compila se ve así:
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);
Un ejemplo se puede descargar aquí:https://dl.dropboxusercontent.com/u/14810011/PortableClassLibraryReferenceProblem.zip
Contiene el proyecto de mi biblioteca y una versión muy reducida del proyecto PRISM PubSubEvents que contiene solo elDelegateReference
clase y su interfaz. El código fuente completo de este último se puede encontrar aquí:http://prismwindowsruntime.codeplex.com/SourceControl/latest
¿Qué puedo hacer para usar todoDelegate
miembros? ¡Gracias de antemano por su ayuda!
EDITAR Después de la respuesta de Henk Holterman:
GetMethodInfo () es un método de extensión que es compatible con el subconjunto PCL. De todos modos, eso no está relacionado con el problema que no puedo llamarDelegate.CreateDelegate
Mientras que el proyecto PCL de PRISM puede.
Editar 2 después del comentario de Hans Passants:
Simplemente jugué un poco y descubrí que cuando activo Silverlight 5 como objetivo de la biblioteca portátil,Delegate.CreateDelegate
es de hecho accesible (y el Método de Extensión GetMethodInfo ya no lo es). EsDelegate.CreateDelegate
¿Entonces tal vez asignado a otra API para aplicaciones de Windows 8 Store y Phone internamente? Es la única forma en que puedo pensar en cómo se podría acceder a este método de repente solo porque agregué Silverlight 5 como un objetivo válido.
(Puede reproducir esto haciendo clic con el botón derecho en el proyecto "MyPortableClassLibrary", haga clic en "Propiedades" y en la pestaña "Biblioteca", haga clic en cambiar para seleccionar los marcos a los que se dirige la biblioteca portátil).
Además, hoy más temprano, creé un proyecto de aplicación de la Tienda Windows y vi que no habíaCreateDelegate
método definido en elDelegate
Clase en .NET para Windows Runtime.
En mi proyecto real, no quiero apuntar a Silverlight 5 mientras usoIObservable<T>
yIObserver<T>
usando mucho Rx y estas interfaces no están definidas en Silverlight.