C# 在设置或获取属性之前,应该执行一个在编译时未知的方法?

C# 在设置或获取属性之前,应该执行一个在编译时未知的方法?,c#,.net,reflection,C#,.net,Reflection,在设置或获取属性之前,应该执行一个在编译时未知的方法? 是否可以将方法添加为运行时 public string MyName { get { //A Methode should called here return m_ASD; } set { //A Methode should called here m_ASD = value; } } 最简单的解决方案是提供可

在设置或获取属性之前,应该执行一个在编译时未知的方法? 是否可以将方法添加为运行时

public string MyName 
{
    get 
    { 
        //A Methode should called here
        return m_ASD; 
    }
    set 
    { 
        //A Methode should called here
        m_ASD = value; 
    }
}

最简单的解决方案是提供可在运行时设置的挂钩:

public Action OnMyNameSet { get; set; }
public Action OnMyNameGet { get; set; }
public string MyName
{
    get
    {
        if (OnMyNameGet != null) { OnMyNameGet(); }
        return m_ASD;
    }
    set
    {
        if (OnMyNameSet != null) { OnMyNameSet(); }
        m_ASD = value;
    }
}
用法:

MyClass c = new MyClass();
c.OnMyNameSet = NameOfSomeMethod;
c.MyName = ...;                   // also executes NameOfSomeMethod();

或者,您可以创建消费者可以附加到的事件。这就是钩子通常在.NET框架中实现的方式

public event EventHandler OnMyNameSet;
public event EventHandler OnMyNameGet;
public string MyName
{
    get
    {
        if (OnMyNameGet != null) { OnMyNameGet(this, EventArgs.Empty); }
        return m_ASD;
    }
    set
    {
        if (OnMyNameSet != null) { OnMyNameSet(this, EventArgs.Empty); }
        m_ASD = value;
    }
}
用法相似;但是,请注意,使用
+=
而不是
=

MyClass c = new MyClass();
c.OnMyNameSet += NameOfSomeMethod;
c.MyName = ...;                   // also executes NameOfSomeMethod(sender, eventArgs);

最简单的解决方案是提供可在运行时设置的挂钩:

public Action OnMyNameSet { get; set; }
public Action OnMyNameGet { get; set; }
public string MyName
{
    get
    {
        if (OnMyNameGet != null) { OnMyNameGet(); }
        return m_ASD;
    }
    set
    {
        if (OnMyNameSet != null) { OnMyNameSet(); }
        m_ASD = value;
    }
}
用法:

MyClass c = new MyClass();
c.OnMyNameSet = NameOfSomeMethod;
c.MyName = ...;                   // also executes NameOfSomeMethod();

或者,您可以创建消费者可以附加到的事件。这就是钩子通常在.NET框架中实现的方式

public event EventHandler OnMyNameSet;
public event EventHandler OnMyNameGet;
public string MyName
{
    get
    {
        if (OnMyNameGet != null) { OnMyNameGet(this, EventArgs.Empty); }
        return m_ASD;
    }
    set
    {
        if (OnMyNameSet != null) { OnMyNameSet(this, EventArgs.Empty); }
        m_ASD = value;
    }
}
用法相似;但是,请注意,使用
+=
而不是
=

MyClass c = new MyClass();
c.OnMyNameSet += NameOfSomeMethod;
c.MyName = ...;                   // also executes NameOfSomeMethod(sender, eventArgs);

你的目标到底是什么?这可能很危险。如果被调用的方法将设置/获取
MyName
属性,那么它将导致一个无限循环。您的目标是什么?这可能很危险。如果被调用的方法将设置/获取
MyName
属性,那么它将导致无限循环。您也可以使用委托链执行此操作-公开方法以向委托对象添加/删除方法,然后在属性中调用委托对象。这样做的好处是,您可以隐式调用多个方法(链中的方法数量相同),并且可以避免空测试(调用空链无效)。@Eight BitGuru:True。我添加了一个事件替代动作的替代方案,它具有类似的优点(多种方法),并且比委托链更适合.NET(尽管在幕后,事件是使用委托链实现的)。@Heinzi谢谢!(我有一个从基类调用Methode的解决方案)不更改MyName属性的任何解决方案也可能吗?@RaphaelRi:不幸的是,据我所知,这是不可能的。你也可以通过委托链来实现这一点-公开方法以向委托对象添加/删除方法,然后在属性中调用委托对象。这样做的好处是,您可以隐式调用多个方法(链中的方法数量相同),并且可以避免空测试(调用空链无效)。@Eight BitGuru:True。我添加了一个事件替代动作的替代方案,它具有类似的优点(多种方法),并且比委托链更适合.NET(尽管在幕后,事件是使用委托链实现的)。@Heinzi谢谢!(我有一个从基类调用Methode的解决方案)不更改MyName属性的任何解决方案也可能吗?@RaphaelRi:不幸的是,据我所知,这是不可能的。