Подтвердить что ты не робот

Использование Reflection в .NET Core

Для кросс-платформенной разработки я пытаюсь создать общую библиотеку .NET Core. Я использовал шаблон проекта Class Library (package) в VS 2015. Моя библиотека должна использовать несколько механизмов отражения, которые я знаю из полной .NET Framework, но я не понимаю, как получить доступ к ним в библиотеке .NET Core. В частности:

  • Тип Delegate имеет свойство Method, которое возвращает объект MethodInfo.
  • Класс Type имеет свойство BaseType, свойство FilterName, метод InvokeMember и метод FindMembers, который я не могу найти в .NET Core.

Я добавил пакеты NuGet, которые, как утверждается, имеют фрагменты отражения, которые мне нужны:

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

Я также добавил using System.Reflection, но я все еще получаю ошибки, указывающие, что эти свойства и типы undefined.

Что я делаю неправильно?

В случае, если это актуально, на этом же компьютере команда dnvm list показывает:

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

Выше было именно то, что я хочу... или, по крайней мере, то, что, я думаю, хочу.;)

4b9b3361

Ответ 1

Короткий ответ

Что я делаю неправильно?

Вы пытаетесь получить доступ к элементам, доступным в .NET 4.5.1, но не в 5.4.

4.x                        Workaround in 5.x/Core

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

Снайпер непосредственно из Visual Studio.

Visual Studio сообщает об этом, если мы наводим указатель мыши на ошибку.

ype.BaseType недоступен...

Отчет о переносимости .NET

Также стоит посмотреть .NET Portability Analyzer. Это расширение, которое мы можем установить из галереи Visual Studio.

Запуск он говорит нам, например, что Type.BaseType недоступен и рекомендует обходное решение.

.NET Outputability Analyzer output

Ответ 2

Если вы не хотите, чтобы ваш исходный код был заполнен операторами #if ... #else ... #endif, вы могли бы использовать вспомогательную библиотеку, например https://www.nuget.org/packages/ReflectionBridge/, которая обеспечивает некоторые расширения, которые определяют мост для различий между типом и типом. (Исходный код https://github.com/StefH/ReflectionBridge)

Ответ 3

Я использую .net Core 1.0. Попробуйте выполнить следующий фрагмент проекта project.json и посмотрите, работает ли он для вас. Я также заметил, что вы используете бета-API, поэтому, если возможно, оставайтесь в стороне от бета-версии.

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

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

    "frameworks": {
        "dnxcore50": { }
    }
}