ASP.NET vNext Core CLR отсутствует тип .IsPrimitive
Я пытаюсь перенести веб-приложение в ASP.Net vNext с целью его запуска в Linux.
В приложении много кода отражения, и я должен упускать некоторые зависимости, поскольку получаю ошибки компиляции в коде, например
Type.IsPrimitive, Type.GetConstructor Type.GetMethod Type.GetTypeArray Ошибка CS1061 "Тип" не содержит определения для "IsPrimitive", и не может быть найден метод расширения "IsPrimitive", принимающий первый аргумент типа "Тип" (если вам не указана директива using или ссылка на сборку?)
Ошибка CS1061 "Тип" не содержит определения для "GetMethod", и не может быть найден метод расширения "GetMethod", принимающий первый аргумент типа "Тип" (вам не хватает директивы using или ссылки на сборку?)
Ошибка CS1061 "Тип" не содержит определения для "GetProperties", и не может быть найден метод расширения "GetProperties", принимающий первый аргумент типа "Тип" (вам не хватает директивы using или ссылки на сборку?)
Ошибка CS1061 "Тип" не содержит определения для "GetInterface", и не может быть найден метод расширения "GetInterface", принимающий первый аргумент типа "Тип" (вам не хватает директивы using или ссылки на сборку?)
У меня есть следующие зависимости в файлах project.json
"frameworks" : {
"aspnetcore50" : {
"dependencies": {
"System.Runtime": "4.0.20-beta-22416",
"System.Linq": "4.0.0.0-beta-22605",
"System.Reflection": "4.0.10.0-beta-22605",
"System.Reflection.Primitives": "4.0.0.0-beta-22605",
"System.Runtime.Extensions": "4.0.10.0-beta-22605",
"System.Reflection.Extensions": "4.0.0.0-beta-22605"
}
Следующие компилируются в соответствии с VS 2013 и .Net 4.5, но не будут компилироваться в VS 2015 с использованием зависимостей выше
using System;
using System.Reflection;
namespace Project1
{
public class Class1
{
public Class1()
{
Type lBaseArrayType = typeof(Array);
Type lStringType = typeof(string);
string[] lStringArray = new string[1];
if (lStringType.IsPrimitive)
{
}
ConstructorInfo lConstructor = lStringType.GetConstructor(new Type[0]);
MethodInfo lMethod = lStringType.GetMethod("Equals");
Type[] lTArray = Type.GetTypeArray(lStringArray);
PropertyInfo[] lProps = lStringType.GetProperties();
}
}
}
Ответы
Ответ 1
Если вы используете aspnetcore.IsPrimitive доступен, но не как член типа. Вы найдете его под TypeInfo, к которому можно получить доступ, вызвав метод GetTypeInfo()
типа. В вашем примере это будет:
lStringType.GetTypeInfo().IsPrimitive
Type.GetMethod()
также доступен, но вам нужно будет ссылаться на пакет System.Reflection.TypeExtensions
в вашем файле project.json
.
Type.GetTypeArray()
отсутствует, но вы можете легко написать простой запрос linq для извлечения массива типов членов в массиве.
Type.GetInterface()
не включается, но при использовании System.Reflection.TypeExtensions
будет показан другой метод, который генерирует Type[]
всех реализованных интерфейсов для указанного типа.
Type[] types = Type.GetInterfaces()
Type.GetProperties()
снова доступен через библиотеку System.Reflection.TypeExtensions
.
Ответ 2
Вы можете использовать статический метод System.Reflection.IntrospectionExtensions.GetTypeInfo()
для получения той же информации.
var arrayType = typeof(Array);
var stringType = typeof(string);
var stringArray = new string[1];
var stringTypeInfo = stringType.GetTypeInfo();
if (stringTypeInfo.IsPrimitive)
{
}
ConstructorInfo lConstructor = stringTypeInfo.DeclaredConstructors.Where(x => x.GetParameters().Any() == false).FirstOrDefault();
MethodInfo lMethod = stringTypeInfo.DeclaredMethods.Where(x => x.Name == "Equals").FirstOrDefault();
Type[] lTArray = stringArray.Where(x => x != null).Select(x => x.GetType()).Distinct().ToArray();
PropertyInfo[] lProps = stringTypeInfo.DeclaredProperties.ToArray();