.Net Core中的反思和属性拒绝合作

时间:2017-07-27 13:15:40

标签: c# .net-core

我上课了:

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

        }

Method是MethodAttribute类。在Animal.dll我有类似Dog,Cat等的类,其属性为[Method("cat")],依此类推。在我的字典中,我想将此属性名称添加为字符串,并键入类型(dog, Dog),依此类推。我的问题是我的程序不这样做。在变量动物中运行程序后,我有0分。我应该改变什么来实现我想要的?

1 个答案:

答案 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);
    }
}