钩对象实例化

时间:2016-04-09 22:50:10

标签: c#

我想知道在实例化对象时是否有办法挂钩事件。

如果没有,有没有办法在实例化属性时检索附加属性的对象?

我想要做的是给我的一些类一个自定义属性,每当实例化具有此属性的类时,为它运行一些代码。

当然,我可以简单地将代码放在每个类的构造函数中,但这是很多的复制和粘贴,我很容易忘记将该代码复制到一个或两个类中。当然,对于最终用户来说非常方便,因为他们所要做的就是将我的属性添加到他们的类中,而不必担心记住在他们的构造函数中添加那些代码。

我实际上不能做基类,因为所有这些对象都已经有了基础。

提前致谢。

以下是我想做的一个例子。要么使用属性的构造函数,要么具有用于对象实例化的事件处理程序。

public class MySuperAttribute : Attribute
{
    public MySuperAttribute()
    {
        //Something akin to this or the event in Global
        Global.AddToList(this.TheTargetObject);
    }
}
[MySuperAttribute]
public class MyLabel : System.Windows.Forms.Label
{
}
public static class Global
{
    public static void AddToList(Object obj)
    {
        //Add the object to a list
    }
    //Some pseudo-hook into the instantiation of any object from the assembly
    private void Assembly_ObjectInstantiated(Object obj)
    {
        if(obj.GetType().GetCustomAttributes(typeof(MySuperAttribute), true).Count != 0)
            AddtoList(obj);
    }
}

1 个答案:

答案 0 :(得分:1)

没有简单的方法可以在外部挂钩对象实例化,也许还有一些调试API,这是有充分理由的。它使您的代码更难以维护和理解为其他人。

属性不起作用,因为在需要之前,实际上并不创建属性的实例 - 通过反射,并将属性分配给类型,而不是实例。

但是您可以将代码放在基类中,并从中派生所有其他类,尽管将半初始化的实例传递给其他方法也不是一个好习惯。如果该类继承自 ContextBoundObject ,则可以为其分配 ProxyAttribute 的自定义实现,并覆盖其上的所有操作。

如果您无法创建公共基类(当您的类型继承自不同类型时),您始终可以使用如下自定义方法创建实例:

public static T Create<T>() where T : new()
{
    var inst = new T();
    Global.AddToList(inst);
    return inst;
}

但是,当您从表单控件继承时,它们的实例化可能由设计器控制。在这种情况下,恐怕没有完美的解决方案。