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

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();
        }
    }
}
4b9b3361

Ответ 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();