C# Net内核中的反射和属性拒绝合作

C# Net内核中的反射和属性拒绝合作,c#,.net-core,C#,.net Core,我有课: public class Domain { public static Assembly[] GetAssemblies() { var assemblies = new List<Assembly>(); foreach (ProcessModule module in Process.GetCurrentProcess().Modules) {

我有课:

    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();
        }
    }
公共类域
{
公共静态程序集[]GetAssemblys()
{
var assemblies=新列表();
foreach(Process.GetCurrentProcess().Modules中的ProcessModule模块)
{
尝试
{
var assemblyName=AssemblyLoadContext.GetAssemblyName(module.FileName);
var assembly=assembly.Load(assemblyName);
组件。添加(组件);
}
捕获(BadImageFormatException)
{
//忽略本机模块
}
}
返回程序集。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());
            }

        }
类程序
{
公共静态词典;
静态void Main(字符串[]参数)
{
var assTab=Domain.GetAssemblies();
foreach(assTab中的var程序集)
{
var m=assembly.GetCustomAttribute();
如果(m!=null)
{
Add(m.Name,assembly.GetType());
}
}

其中,Method是一个
MethodAttribute
类。在
Animal.dll
中,我有一个类,如Dog、Cat等,其属性为
[Method(“Cat”)]
等等。在我的字典中,我想将此属性名称添加为string,类型为type
(Dog、Dog)
等等。我的问题是我的程序没有做到这一点。在variable animal中运行程序后,我得到了0分。我应该改变什么来实现我想要的?

问题在这一行:

var m = assembly.GetCustomAttribute<Method>();
var m=assembly.GetCustomAttribute();
此行正在获取程序集的属性。因此,如果该属性未应用于程序集,则返回null

您需要做的是首先获取程序集中的类型,然后检查每个类型上是否有属性。类似如下:

foreach(Type type in assembly.GetTypes())
{
    var attr = assembly.GetCustomAttribute<Method>();
    if (attr!=null)
    {
        animals.Add(attr.Name, type);
    }
}
foreach(在assembly.GetTypes()中键入Type)
{
var attr=assembly.GetCustomAttribute();
如果(attr!=null)
{
添加(属性名称、类型);
}
}

但现在看不到我的dll。我将project animal设置为类库,主要是添加对它的引用。但现在我的代码由您修复,无限执行:(你能解释一下在无穷大中执行是什么意思吗?例如,它在哪一行被卡住了,或者如果它是一个循环,它在循环什么?我的代码中只有一个foreach,它不应该被卡住…如果你还没有,你应该使用调试器来找出它现在出了什么问题。我猜它是在以后的某个地方因为您遇到了问题,而且您以前的字典中没有任何内容,所以您现在才遇到这个问题。当我调试代码时,我在汇编表中看到Animal。在Animal中,我有一个类Dog,它具有属性[Method('Dog)].但是当我添加代码并开始调试时,它没有看到任何类似动物的东西,只是在其他集合中迭代。我有点困惑…你说“我在集合表中看到动物”,我认为这意味着你在
GetAssemblies
的响应中看到了该集合。但是你接着说“它没有看到任何东西像Animal那样只是在其他程序集中迭代“这表明它不在
getAssembly
的响应中……我的建议显然没有涉及获取程序集代码,它只是向您展示了如何循环遍历程序集的类型。如果它从未到达您的动物程序集中,那么我假设它不在加载的程序集中或类似的内容中。。。