gpt4 book ai didi

c# - 反射(reflection):在运行时区分事件字段和委托(delegate)类型字段

转载 作者:行者123 更新时间:2023-11-30 16:33:02 25 4
gpt4 key购买 nike

我的主要问题是:是否有可能在反射中将某些委托(delegate)类型的字段与事件用作存储字段的字段区分开来?这归结为一个问题:FieldInfo 类是否包含关于它是否属于事件的信息,如 storagefield ?我找不到任何可能说明问题的属性,也找不到自定义属性。

在下面的代码中,SomeField 和 SomeEvent 的 FieldInfo 的相关属性是相同的。所以我不知道如何根据它们是否是 eventstoragefields 对 FieldInfos 进行排序。

using System;
using System.Reflection;
using System.Runtime.CompilerServices;

namespace Test
{
class Program
{
public Action SomeField;
public event Action SomeEvent;
static void Main(string[] args)
{
FieldInfo[] fields = typeof(Program).GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
foreach (FieldInfo fi in fields)
Console.WriteLine(string.Format("FieldName: {0}, Accessibility: {1}, Has Attributes: {2}.", fi.Name, fi.Attributes,
fi.GetCustomAttributes(true).Length != 0));
Console.ReadLine();
}
}
}

一种解决方案是搜索具有完全相同名称的 eventInfo,但我不知道这是否万无一失,坦率地说,我不会对该解决方案感到满意。必须有更直接的方法。

最佳答案

您已经定义了类似字段的事件:

C# 语言规范:

When compiling a field-like event, the compiler automatically creates storage to hold the delegate, and creates accessors for the event that add or remove event handlers to the delegate field.

未指定编译器如何为存储字段生成名称。通常这个字段名称与事件名称匹配,因此您将有两个名称相同的成员(在您的示例中为 SomeName),但成员类型和可见性不同(事件 - 公共(public),字段 - 私有(private))。

Type.GetMember() :

The GetMembers method does not return members in a particular order, such as alphabetical or declaration order. Your code must not depend on the order in which members are returned, because that order varies.

如果您重载不带参数的 GetMembers(),那么它应该只返回公共(public)成员 - 事件。但是,如果您将另一个重载(接受 BindingFlags)与 BindingFlags.NonPublic 一起使用 - 那么它将以未指定的顺序返回字段和事件,因此您不能依赖您获得的第一个元素将是事件。

关于c# - 反射(reflection):在运行时区分事件字段和委托(delegate)类型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3593334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com