Использование 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
Выше было именно то, что я хочу... или, по крайней мере, то, что, я думаю, хочу.;)
Ответы
Ответ 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": { }
}
}