我想知道在实例化对象时是否有办法挂钩事件。
如果没有,有没有办法在实例化属性时检索附加属性的对象?
我想要做的是给我的一些类一个自定义属性,每当实例化具有此属性的类时,为它运行一些代码。
当然,我可以简单地将代码放在每个类的构造函数中,但这是很多的复制和粘贴,我很容易忘记将该代码复制到一个或两个类中。当然,对于最终用户来说非常方便,因为他们所要做的就是将我的属性添加到他们的类中,而不必担心记住在他们的构造函数中添加那些代码。
我实际上不能做基类,因为所有这些对象都已经有了基础。
提前致谢。
以下是我想做的一个例子。要么使用属性的构造函数,要么具有用于对象实例化的事件处理程序。
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);
}
}
答案 0 :(得分:1)
没有简单的方法可以在外部挂钩对象实例化,也许还有一些调试API,这是有充分理由的。它使您的代码更难以维护和理解为其他人。
属性不起作用,因为在需要之前,实际上并不创建属性的实例 - 通过反射,并将属性分配给类型,而不是实例。
但是您可以将代码放在基类中,并从中派生所有其他类,尽管将半初始化的实例传递给其他方法也不是一个好习惯。如果该类继承自 ContextBoundObject ,则可以为其分配 ProxyAttribute 的自定义实现,并覆盖其上的所有操作。
如果您无法创建公共基类(当您的类型继承自不同类型时),您始终可以使用如下自定义方法创建实例:
public static T Create<T>() where T : new()
{
var inst = new T();
Global.AddToList(inst);
return inst;
}
但是,当您从表单控件继承时,它们的实例化可能由设计器控制。在这种情况下,恐怕没有完美的解决方案。