【问题标题】:Retrieving Event name from lambda expression从 lambda 表达式中检索事件名称
【发布时间】:2010-03-06 10:29:22
【问题描述】:

有没有办法如何从 Lambda 表达式中获取名称 ov 事件,例如使用属性 ( Retrieving Property name from lambda expression) ?

谢谢

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    是的,这就像获取属性名称一样,但必须在定义事件的类中进行。

    public class Foo
    {
        public event EventHandler Bar;
    
        public string BarName
        {
            get
            {
                return this.GetEventName(() => this.Bar);
            }
        }
    
        private string GetEventName(Expression<Func<EventHandler>> expression)
        {
            return (expression.Body as MemberExpression).Member.Name;
        }
    }
    

    享受吧。

    【讨论】:

    • 如果我理解正确,在这种情况下“this.Bar”被接受为字段,不是吗?它与“公共事件事件处理程序栏”和“公共事件处理程序栏”相同,对吧?这对我的目的没有用(我正在使用 3rd 方类),但在某些情况下它可以是解决方法。谢谢您的回复! (+1)
    • 是的,恐怕你是对的。您只能在定义事件的类中使用这种方法。
    【解决方案2】:

    没有。 C# lambda 不支持事件,因此无法表示这一点。您必须使用反射。

    【讨论】:

    • 我不想使用诸如 "GetEventInfo( button1, "Click" ) 之类的东西,因为输入带有事件的字符串名称。有没有其他方法可以获得 100% 正确的事件名称或引用 EventInfo 或委托事件的 add_/remove_ 方法?一些 AOP 方式还是其他方式?谢谢
    • @TcKs - 不是真的。选项:(1)使用一个接口来暴露你的事件,并转换到那个接口; (2)(仅适用于*Changed)使用抽象如PropertyDescriptor,可以代表您将属性映射到匹配事件; (3) 使用字符串(带有一些单元测试)。我想我们都会喜欢这里缺少的infoof 运算符,但它不存在。我们一直在问......
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多