2017-01-23 43 views
1

我需要字符串中的類實例來檢查它是否具有某個特性。 我已經試過這樣的在.NetCore中動態獲取類的實例

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

但是type是null?

整個代碼在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

你確定你的類型是在當前程序集中,而不是在不同的程序集中? –

+0

這是同一個項目。 只需創建新項目 - > .NET核心 - >控制檯應用程序。 我將它命名爲AssemblyTest,我更新了添加完整代碼的問題。 – borisdj

回答

1

當指定必須提供包括它的命名空間的完全限定名稱類的名稱。所以這條線需要調整了:

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

如果類名是在命名空間App.Logic後再行應該是:

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

所以給你更新的代碼行應該是:

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

我已經測試過,如果有效使用包含名稱空間信息的合格類名稱。

+1

是的,我也檢查過它。謝謝。 只需添加您提到的另一種獲取類型的方法: Type type = Type.GetType(「AssemblyTest.TestClass」); – borisdj