c# – 在运行时使用反射检查给定事件是否已订阅
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在运行时使用反射检查给定事件是否已订阅,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2175字,纯文字阅读大概需要4分钟。
内容图文
![c# – 在运行时使用反射检查给定事件是否已订阅](/upload/InfoBanner/zyjiaocheng/791/841cae22928345b58264a519a6ecd46e.jpg)
考虑一个有一些事件的类.此事件列表将会增长.有些是可选的.其他是必需的.
为了简化一些初始验证,我有一个自定义属性,将事件标记为必需属性.
例如:
[RequiredEventSubscription("This event is required!")]
public event EventHandler ServiceStarted;
到现在为止还挺好.
要使用反射验证所有事件,我会迭代事件列表并获取自定义属性.
但我需要一种方法来确定事件是否已订阅.
没有反射,ServiceStarted.GetInvocationList就可以完成工作.但事件必须来自此列表:
var eventList = this.GetType().GetEvents().ToList();
有没有办法检查事件列表中的给定事件是否使用反射进行订阅?
– [更新] –
这是基于Ami答案的可能解决方案:
private void CheckIfRequiredEventsAreSubscribed()
{
var eventList = GetType().GetEvents().ToList().Where(e => Attribute.IsDefined(e, typeof(RequiredEventSubscription)));
StringBuilder exceptionMessage = new StringBuilder();
StringBuilder warnMessage = new StringBuilder();
foreach (var evt in eventList)
{
RequiredEventSubscription reqAttr = (RequiredEventSubscription) evt.GetCustomAttributes(typeof(RequiredEventSubscription), true).First();
var evtDelegate = this.GetType().GetField(evt.Name, BindingFlags.Instance | BindingFlags.NonPublic);
if (evtDelegate.GetValue(this) == null)
{
warnMessage.AppendLine(reqAttr.warnMess);
if (reqAttr.throwException) exceptionMessage.AppendLine(reqAttr.warnMess);
}
}
if (warnMessage.Length > 0)
Console.WriteLine(warnMessage);
if (exceptionMessage.Length > 0)
throw new RequiredEventSubscriptionException(exceptionMessage.ToString());
}
非常感谢!!
解决方法:
这里有一些主要的设计问题.通常,没有办法向对象询问其事件的订阅者是谁.任何人都想要这个功能是非常不寻常的,但是如果你真的想要它,你应该让类以某种方式公开它,例如,通过实现一个方法的接口,例如:
public IEnumerable<Delegate> GetSubscribers(string eventName);
无论如何,要回答问题,您可以使用反射,但前提是您确切知道如何维护订阅者.例如,
假设所有事件都是使用C#字段类事件的当前实现实现的,您可以执行类似的操作(强烈建议不要):
object o = ...
var unsubscribedEvents =
from e in o.GetType().GetEvents()
where Attribute.IsDefined(e, typeof(RequiredEventSubscriptionAttribute))
let field = o.GetType()
.GetField(e.Name, BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(o)
where field == null
select field;
var isValid = !unsubscribedEvents.Any();
内容总结
以上是互联网集市为您收集整理的c# – 在运行时使用反射检查给定事件是否已订阅全部内容,希望文章能够帮你解决c# – 在运行时使用反射检查给定事件是否已订阅所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。