net - reflection c# español
Usando Reflection en.NET Core (3)
Respuesta corta
¿Qué estoy haciendo mal?
Está intentando acceder a miembros que están disponibles en .NET 4.5.1 pero no en 5.4.
4.x Workaround in 5.x/Core
Delegate.Method. Delegate.GetMethodInfo()
Type.BaseType. Type.GetTypeInfo()
Type.FilterName -
Type.InvokeMember -
Type.FindMembers -
Recortar directamente desde Visual Studio.
Visual Studio nos dice esto si pasamos el mouse sobre el error.
Informe de portabilidad .NET
También vale la pena mirar el Analizador de Portabilidad .NET . Es una extensión que podemos instalar desde la Galería de Visual Studio .
Ejecutarlo nos dice, por ejemplo, que Type.BaseType
no está disponible y recomienda una solución.
Para el desarrollo multiplataforma, estoy tratando de hacer una biblioteca compartida .NET Core. Utilicé la plantilla de proyecto Class Library (package)
en VS 2015. Mi biblioteca necesita usar un par de mecanismos de reflexión con los que estoy familiarizado en el marco completo de .net 4, pero ahora no sé cómo acceder a estos en un .NET Core biblioteca. Específicamente:
- El tipo de
Delegate
tiene una propiedad deMethod
que devuelve un objetoMethodInfo
. - La clase
Type
tiene una propiedadBaseType
, una propiedadFilterName
,InvokeMember
métodoFindMembers
yFindMembers
métodoFindMembers
que no puedo alcanzar en .NET Core.
Agregué paquetes de NuGet que supuestamente tienen las piezas de reflexión que necesito:
"frameworks": {
"net451": {
"dependencies": {
"System.Reflection": "4.1.0-beta-23516",
"System.Reflection.Extensions": "4.0.1-beta-23516",
"System.Reflection.Primitives": "4.0.1-beta-23516",
}
},
"dotnet5.4": {
"dependencies": {
"Microsoft.CSharp": "4.0.1-beta-23516",
"System.Collections": "4.0.11-beta-23516",
"System.Linq": "4.0.1-beta-23516",
"System.Reflection": "4.1.0-beta-23516",
"System.Reflection.Extensions": "4.0.1-beta-23516",
"System.Reflection.Primitives": "4.0.1-beta-23516",
"System.Runtime": "4.0.21-beta-23516",
"System.Threading": "4.0.11-beta-23516"
}
}
},
"dependencies": {
"System.Reflection.TypeExtensions": "4.1.0-beta-23516"
}
También agregué el using System.Reflection
, pero todavía recibo errores que indican que estas propiedades y tipos no están definidos.
¿Qué estoy haciendo mal?
En caso de que sea relevante, en esta misma máquina el comando dnvm list
muestra:
Active Version Runtime Architecture OperatingSystem Alias
------ ------- ------- ------------ --------------- -----
1.0.0-rc1-update1 clr x64 win
1.0.0-rc1-update1 clr x86 win
1.0.0-rc1-update1 coreclr x64 win
* 1.0.0-rc1-update1 coreclr x86 win default
Lo anterior es exactamente lo que quiero ... o al menos lo que creo que quiero. ;)
Estoy usando .net Core 1.0. Intente seguir un fragmento de project.json y ver si funciona para usted. También me he dado cuenta de que está utilizando la API beta, por lo que, si es posible, manténgase alejado de la beta.
{
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
},
"dependencies": {
"NETStandard.Library": "1.0.0-rc2-23811",
"System.Reflection.TypeExtensions": "4.0.0"
},
"frameworks": {
"dnxcore50": { }
}
}
Si no desea que su código original #if ... #else ... #endif
lleno de #if ... #else ... #endif
, puede usar una biblioteca auxiliar como https://www.nuget.org/packages/ReflectionBridge/ que proporciona algunas extensiones que definen un puente para las diferencias entre Type y TypeInfo.
(Código fuente en https://github.com/StefH/ReflectionBridge )