2015-03-12 13 views
12

Próbuję przenieść aplikację internetową do ASP.Net vNext z ewentualnym celem uruchomienia jej na Linuksie.ASP.NET vNext Core CLR brakujący typ.IsPrimitive

Aplikacja ma dużo kodu refleksji i I musi być brakuje pewnych zależności, jak ja dostaję błędy kompilacji na kod taki jak ten

Type.IsPrimitive, Type.GetConstructor Type.GetMethod Type.GetTypeArray Błąd CS1061 "Typ" nie zawiera definicji "IsPrimitive" i nie można znaleźć metody rozszerzenia "IsPrimitive" akceptującej pierwszy argument typu "Typ" (czy brakuje dyrektywy użycia lub odniesienia do zespołu?)

Błąd CS1061 "Typ" nie zawiera definicji "GetMethod" ani metody rozszerzenia "GetMethod" akceptującej pierwszy można znaleźć argument typu "Typ" (czy brakuje dyrektywy użycia lub odniesienia do zespołu?)

Błąd CS1061 "Typ" nie zawiera definicji "GetProperties" ani metody rozszerzenia "GetProperties" akceptującej pierwszy można znaleźć argument typu "Typ" (czy brakuje dyrektywy użycia lub odniesienia do zespołu?)

Błąd CS1061 "Typ" nie zawiera definicji "GetInterface" ani metody rozszerzenia "GetInterface" akceptującej pierwszy można znaleźć argument typu "Typ" (czy brakuje dyrektywy użycia lub odniesienia do zespołu?)

Mam następujące ing zależności w moich plikach 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" 
     } 

Poniższa kompiluje pod VS 2013 i .NET 4.5, ale przyzwyczajenie kompilacji w VS 2015 przy użyciu zależności powyżej

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(); 
     } 
    } 
} 
+0

Pokaż swój odpowiedni kod? Najlepiej [Minimalny, kompletny i sprawdzalny przykład] (http://stackoverflow.com/help/mcve). Może to być tak proste, jak brak niektórych instrukcji użycia, ale trudno o tym wiedzieć, chyba że pokażesz nam kod. – mason

+0

Poniżej znajduje się przykładowy fragment kodu, nie robi nic, ale jest tylko wyborem metod, które próbuję wywołać –

+0

Sprawdziłem kod źródłowy na GitHub i nie mogłem znaleźć tych metod. Być może to tylko jedna z rzeczy, których jeszcze nie wdrożyły dla .NET CORE? Możesz nie kompilować tych rzeczy z dyrektywami kompilatora w .NET 5 (nie-CORE). – mason

Odpowiedz

21

Jeśli używasz aspnetcore. IsPrimitive jest dostępny, ale nie należy do Type. Znajdziesz go w TypeInfo, do którego można uzyskać dostęp, wywołując metodę Type z numerem GetTypeInfo(). W przykładzie będzie to:

lStringType.GetTypeInfo().IsPrimitive 

Type.GetMethod() jest również dostępny, ale trzeba odwołać pakiet System.Reflection.TypeExtensions w pliku project.json. Brakuje

Type.GetTypeArray(), ale można łatwo napisać proste zapytanie linq, aby pobrać tablicę typów członków w tablicy.

Type.GetInterface() nie jest uwzględniony, ale ponownie za pomocą System.Reflection.TypeExtensions ujawni inną metodę, która generuje Type[] wszystkich wdrożonych interfejsów dla określonego typu.

Type[] types = Type.GetInterfaces() 

Type.GetProperties() będzie dostępny przez bibliotekę System.Reflection.TypeExtensions.

+0

Ale te metody nie są dostępne w .NET Core tylko w DNX –

+0

Musisz dodać 'using System.Reflection;', aby uzyskać dostęp do 'GetTypeInfo()' –

0

Możesz użyć statycznej metody System.Reflection.IntrospectionExtensions.GetTypeInfo(), aby uzyskać te same informacje.

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();