C#设计模式:通用方法?

ste*_*ell 1 .net design-patterns

并感谢您的帮助

对于:

public abstract class EntityBase
{    
 protected void Create(EntityBase c)    
 {        
    Log.Audit(c);
 }
}

public class Customer : EntityBase
{    
 public void CreateCustomer(Customer c)    
 {        
  Create(c);    
 }    
 }
}

public class Car : EntityBase
{    
 public void CreateCar(Car c)    
 {        
  Create(c);    
 }    
 }
}
Run Code Online (Sandbox Code Playgroud)

对于上面的示例1)您将如何实现方法签名:Log.Audit(c);

2)在方法Audit(c)中,我们需要将c转换为适当的类型,并遍历整个对象的属性以进行审计.如何实现这一目标.我在想......

public Audit(T t)
{
 switch (t.GetType())
 {
 case Customer:
    //Audit Customer
    Audit(<Customer> t); 
    break;
 case Car:
    //Audit Car
    Audit(<Car> t); 
 }
}
Run Code Online (Sandbox Code Playgroud)

只是一个猜测,任何帮助都会很棒.

注意:如果您能想出更好的方法来构建此方法,请告诉我们.

再次感谢.史蒂芬

Yan*_*rtz 5

在一个方法中,当你有switch或if/else构造来决定如何分派方法时,这是一个告诉你不使用多态的迹象.

一种解决方案是使Audit()成为EntityBase的虚方法,并让Audit在实例上调用它(因此您可以覆盖Customer或Car中的Audit)

您可以作为奖励提供使用反射的默认实现,该反射遍历继承类的每个属性以转储它.

public abstract class EntityBase
{    
     protected void Create(EntityBase c)    
     {        
       Audit(c);
     }

     public virtual void Audit()
    {
    //Default audit code here, using reflection for instance
    }     
}

public class Car : EntityBase
{
    //Does not override, uses default Audit Code
}

public class Hamster : EntityBase
{
    public override void Audit()
    {
        //Specific code here..
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不希望在Entity类或其中一个继承者中拥有Audit责任,则必须采用反射方式.