Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在.net的对象创建过程中添加钩子_.net_Hook - Fatal编程技术网

如何在.net的对象创建过程中添加钩子

如何在.net的对象创建过程中添加钩子,.net,hook,.net,Hook,我想在创建对象之前自定义对象的行为。我想也许可以在对象构造函数中添加一些钩子,然后进行更改,这是一种选择。在.net中有什么方法可以做到这一点吗?提前多谢 编辑: 以下是一个例子: 假设我们有一个班上的孩子,他使用Perform方法在班上获得学分 public class Kid { public void Perform() { ... } } 以及学校举办的讲座: public class School { public void Chemistry() {

我想在创建对象之前自定义对象的行为。我想也许可以在对象构造函数中添加一些钩子,然后进行更改,这是一种选择。在.net中有什么方法可以做到这一点吗?提前多谢

编辑:

以下是一个例子:

假设我们有一个班上的孩子,他使用Perform方法在班上获得学分

public class Kid
{
    public void Perform() { ... }
}
以及学校举办的讲座:

public class School
{
    public void Chemistry() {
        // The school have a good chemistry teacher, so every kid study well
        // Kid.Perform() is modified to reflect that 
        Kid tom = new Kid();
        tom.Perform();
    }

    public void Biology() {
        //This class is boring, everyone will nap in 5~10 min
        // Kid.Perform() use a random number to simulate how 
        //long this kid can hold it.
        Kid tom = new Kid(); tom.Perform();
        Kid jerry = new Kid(); jerry.Perform();
    }
}
我们希望每个孩子的表现都一样,我不希望:

  • 更改class Kid,因为它是从第三方工具生成的,并在其他地方广泛使用
  • 使用继承

  • 您只需将逻辑添加到对象的构造函数中。如果您指的是连接到内存分配等的过程,那么在.NET中是不可用的

    public class MyClass
    {
        public MyClass()
        {
            // Constructor logic here...
        }
    
        public MyClass(string name)
        {
             // Overloaded constructor logic here...
        }
    }
    

    在您的情况下,您必须在调用构造函数后添加逻辑。您可以编写一个工厂方法来实现这一点;用MyExtendedSpecialObject.Create()替换新的SpecialObject()应该不会太难

    public static class MyExtendedSpecialObject
    {
        public static SpecialObject Create()
        {
            var newObject = new SpecialObject();
    
            // Do something with newObject
    
            return newObject;
        }
    }
    

    您可以使用System.Activator创建实例。您还可以“钩住”激活器并执行检查。

    该对象由第三方工具生成。包装类可以解决我的问题,但意味着很多重构工作,我不太满意。还有别的吗?谢谢嗯,同样,您可以使用扩展方法来提供
    Initialize
    方法,但这在功能上类似于包装它。您能否举例说明自定义对象行为的含义?如果您的意思是多次实例化同一个类,但有一些特定的行为差异,那么也许可以选择将委托作为构造函数参数传递进来?我正在修改遗留代码,我想指定如何创建对象。之后,所有对象创建都将遵循该规则。您所说的“如何创建对象”是什么意思?您不能更改类构造函数中的代码吗?是的,很多人使用工厂方法。但我正在修改遗留代码。而且最好是“注入”方式。@Roy:简单的搜索和替换应该不会太困难。如果你想要这样的注入是不可能的(除非是通过面向方面的编程?),这是行不通的,询问者不能控制创建代码,否则他只能使用自己的工厂。