web-dev-qa-db-fra.com

Utilisation de la réflexion dans .NET Core

Pour le développement multiplateforme, j'essaie de créer une bibliothèque partagée .NET Core. J'ai utilisé le modèle de projet Class Library (package) dans VS 2015. Ma bibliothèque doit utiliser quelques mécanismes de réflexion que je connais depuis le framework .net 4 complet, mais je ne sais pas maintenant comment y accéder dans a. Bibliothèque NET Core. Plus précisément:

  • Le type Delegate possède une propriété Method qui renvoie un objet MethodInfo.
  • La classe Type a une propriété BaseType, une propriété FilterName, une méthode InvokeMember et une méthode FindMembers que je ne peux pas atteindre dans .NET Core .

J'ai ajouté des packages NuGet qui auraient les éléments de réflexion dont j'ai besoin:

"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"
}

J'ai également ajouté using System.Reflection, mais je reçois toujours des erreurs qui indiquent que ces propriétés et types ne sont pas définis.

Qu'est-ce que je fais mal?

Si cela est pertinent, sur cette même machine, la commande dnvm list spectacles:

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

Ce qui précède est exactement ce que je veux ... ou du moins ce que je pense que je veux. ;)

26
Brent Arias

Réponse courte

Qu'est-ce que je fais mal?

Vous essayez d'accéder aux membres disponibles dans .NET 4.5.1 mais pas dans 5.4.

4.x                        Workaround in 5.x/Core

Delegate.Method.           Delegate.GetMethodInfo()
Type.BaseType.             Type.GetTypeInfo()
Type.FilterName            -
Type.InvokeMember          -
Type.FindMembers           -

Coupez directement à partir de Visual Studio.

Visual Studio nous le dit si nous passons notre souris sur l'erreur.

ype.BaseType is not available...

Rapport de portabilité .NET

Il vaut également la peine de regarder . NET Portability Analyzer . Il s'agit d'une extension que nous pouvons installer à partir de Visual Studio Gallery .

Son exécution nous indique, par exemple, que Type.BaseType n'est pas disponible et recommande une solution de contournement.

.NET Portability Analyzer output

22
Shaun Luttin

Si vous ne voulez pas que votre code d'origine soit plein de #if ... #else ... #endif instructions, vous pouvez utiliser une bibliothèque d'aide comme https://www.nuget.org/packages/ReflectionBridge/ qui fournit des extensions qui définissent un pont pour les différences entre Type et TypeInfo.

(Code source sur https://github.com/StefH/ReflectionBridge )

6
Stef Heyenrath

J'utilise .net Core 1.0. Essayez l'extrait suivant de project.json et voyez si cela fonctionne pour vous. J'ai également remarqué que vous utilisez l'API bêta, donc si possible restez loin de la bêta.

{
    "version": "1.0.0-*",
    "compilationOptions": {
        "emitEntryPoint": true
    },

    "dependencies": {
        "NETStandard.Library": "1.0.0-rc2-23811",
        "System.Reflection.TypeExtensions": "4.0.0"
    },

    "frameworks": {
        "dnxcore50": { }
    }
}
3
Saleem