ASP.NET vNext Core CLR缺少type.IsPrimitive

时间:2015-03-12 17:14:05

标签: asp.net asp.net-core

我正在尝试将Web应用程序迁移到ASP.Net vNext,最终目的是让它在Linux上运行。

该应用程序有很多反射代码,我必须缺少一些依赖项,因为我在代码上遇到编译错误

  

Type.IsPrimitive,Type.GetConstructor Type.GetMethod Type.GetTypeArray   错误CS1061'类型'不包含' IsPrimitive'的定义没有扩展方法' IsPrimitive'接受类型'类型'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

     

错误CS1061'输入'不包含' GetMethod'的定义并没有扩展方法' GetMethod'接受类型'类型'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

     

错误CS1061'输入'不包含' GetProperties'的定义没有扩展方法' GetProperties'接受类型'类型'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

     

错误CS1061'输入'不包含' GetInterface'的定义没有扩展方法' GetInterface'接受类型'类型'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

我的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();
        }
    }
}

2 个答案:

答案 0 :(得分:21)

如果你正在使用aspnetcore .IsPrimitive可用,但不是Type的成员。您可以在TypeInfo下找到它,可以通过调用Type的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库再次使用。

答案 1 :(得分:1)

您可以使用静态方法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();