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
的响应中……我的建议显然没有涉及获取程序集代码,它只是向您展示了如何循环遍历程序集的类型。如果它从未到达您的动物程序集中,那么我假设它不在加载的程序集中或类似的内容中。。。