从Lambda表达式中检索事件名称

8
2个回答

6

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

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”被视为字段,是吗?它与“public event EventHandler Bar”和“public EventHandler Bar”一样有效,对吗?这对我的目的没有用处(我正在使用第三方类),但在某些情况下可以解决问题。感谢回复!(+1) - TcKs
是的,恐怕你是对的。你只能在定义事件的类中使用这种方法。 - Enigmativity

4

C#的lambda表达式不支持事件,因此无法表示。您必须使用反射。


我不想使用像“GetEventInfo(button1, 'Click')”这样的东西,因为它需要输入事件的字符串名称。有没有其他方法可以获取事件的100%正确名称或对EventInfo或委托的引用,以添加/删除事件方法?是否有一些AOP方式或其他方法?谢谢。 - TcKs
2
@TcKs - 不是很好。选项:(1)使用接口来公开您的事件,并转换为该接口; (2) (仅适用于 *Changed )使用抽象,比如 PropertyDescriptor ,它可以为您映射属性到匹配的事件; (3) 接受字符串(带有一些单元测试)。我认为我们都希望在这里有缺失的 infoof 操作符,但它不存在。我们一直在询问 ... - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接