2017-07-27 41 views
-1

我有類:反思與對.NET核心屬性拒絕合作

public class Domain 
    { 
     public static Assembly[] GetAssemblies() 
     { 
      var assemblies = new List<Assembly>(); 
      foreach (ProcessModule module in Process.GetCurrentProcess().Modules) 
      { 
       try 
       { 
        var assemblyName = AssemblyLoadContext.GetAssemblyName(module.FileName); 
        var assembly = Assembly.Load(assemblyName); 
        assemblies.Add(assembly); 
       } 
       catch (BadImageFormatException) 
       { 
        // ignore native modules 
       } 
      } 

      return assemblies.ToArray(); 
     } 
    } 

我的主類的樣子:

class Program 
{ 
    public static Dictionary<String, Type> animals; 
    static void Main(string[] args) 
    { 
     var assTab = Domain.GetAssemblies(); 
     foreach (var assembly in assTab) 
     { 
      var m = assembly.GetCustomAttribute<Method>(); 
      if (m != null) 
      { 
       animals.Add(m.Name, assembly.GetType()); 
      } 

     } 

凡採用方法是MethodAttribute類。在Animal.dll我有類似狗,貓等屬性[Method("cat")]等。在我的詞典中,我想將此屬性名稱添加爲字符串,並鍵入類型(dog, Dog)依此類推。我的問題是我的程序不這樣做。運行可變動物程序後,我有0分。我應該改變什麼來實現我想要的?

回答

0

的問題是在這條線:

上裝配
var m = assembly.GetCustomAttribute<Method>(); 

該行正變得屬性。所以如果這個屬性沒有被應用到程序集中,那麼你將會返回null。

您需要做的是首先獲取程序集中的類型,然後檢查每個類型是否具有該屬性。更類似於:

foreach(Type type in assembly.GetTypes()) 
{ 
    var attr = assembly.GetCustomAttribute<Method>(); 
    if (attr!=null) 
    { 
     animals.Add(attr.Name, type); 
    } 
} 
+0

但現在看不到我的dll。我將項目動物設置爲類庫,並在Main中添加對它的引用。但現在我的代碼由您執行無限:( – nju

+0

)您可以說明您的意思是在無窮遠處執行嗎?即它卡在哪一行或者它的循環是什麼循環?我的代碼只有一個foreach在它不應該被卡住...如果你還沒有,你應該使用調試器來找出它現在出了什麼問題,我的猜測是,它在某個地方後面,你遇到問題而且你之前在字典中沒有任何東西,這就是爲什麼你現在只能得到這個問題。 – Chris

+0

當我調試我的代碼時,我看到動物在裝配表中。在動物中,我有類Dog [Method('dog)] 。但是當我添加你的代碼並開始調試時,它沒有看到像Animal這樣的東西只是遍歷其他程序集 – nju