2017-01-23 1 views
1

J'ai besoin d'une instance de classe à partir d'une chaîne pour vérifier si elle possède un certain attribut. Je l'ai essayé comme çaObtenir une instance de classe de manière dynamique dans .NetCore

Type type = Assembly.GetEntryAssembly().GetType("ClassName"); 
object entity = Activator.CreateInstance(type); 
var tableAttribute = entity.GetType().GetTypeInfo().GetCustomAttribute<TableAttribute>(); 

mais le type est nul?

Code entier à TestConsoleApp:

using System; 
using System.ComponentModel; 
using System.Reflection; 

namespace AssemblyTest 
{ 
    [Description("TestDescription")] 
    public class TestClass { } 
    // 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      Type type = Assembly.GetEntryAssembly().GetType("TestClass"); 

      if(type == null) 
       Console.WriteLine("Object type is NULL."); 
      else 
       Console.WriteLine("Object type has value."); 

      object entity = Activator.CreateInstance(type); 

      var tableAttribute = entity.GetType().GetTypeInfo().GetCustomAttribute<DescriptionAttribute>(); 
     } 
    } 
} 

enter image description here

+0

Etes-vous sûr que votre type est dans l'assemblage actuel et non dans un autre assemblage? –

+0

C'est le même projet. Il suffit de créer un nouveau projet -> .NET Core -> Application console. Je l'ai nommé AssemblyTest et j'ai mis à jour la question en ajoutant le code entier. – borisdj

Répondre

1

Lorsque vous spécifiez le nom de la classe, vous devez fournir un nom complet qui comprend son espace de noms. Donc, ce besoin de ligne peaufiné:

Type type = Assembly.GetEntryAssembly().GetType("ClassName");

Si ClassName est dans l'espace de noms App.Logic alors la ligne doit être:

Type type = Assembly.GetEntryAssembly().GetType("App.Logic.ClassName");

Ainsi, compte tenu de votre code mis à jour la ligne devrait être:

Type type = Assembly.GetEntryAssembly().GetType("AssemblyTest.TestClass");

Je l'ai testé et cela fonctionne si un nom de classe qualifié qualifié est utilisé qui inclut les informations d'espace de noms.

+1

Oui ça marche, j'ai aussi vérifié. THX. Juste pour ajouter un autre moyen que vous avez mentionné pour obtenir le type: Type de type = Type.GetType ("AssemblyTest.TestClass"); – borisdj