在类的所有方法之前运行方法
是否有可能在C#3或4中做到这一点? 也许有一些反思?
class Magic { [RunBeforeAll] public void BaseMethod() { } //runs BaseMethod before being executed public void Method1() { } //runs BaseMethod before being executed public void Method2() { } }
编辑
有一个替代解决方案,使Magic
成为单例并将您的代码放在静态实例的getter上。 这就是我做的:
public class Magic { private static Magic magic = new Magic(); public static Magic Instance { get { magic.BaseMethod(); return magic; } } public void BaseMethod() { } //runs BaseMethod before being executed public void Method1() { } //runs BaseMethod before being executed public void Method2() { } }
你不能在C#中自动执行此操作 – 你应该看看AOP,例如使用PostSharp 。
有一个替代解决方案,使Magic成为单例并将您的代码放在静态实例的getter上。 这就是我所做的。
public class Magic{ private static Magic magic; public static Magic Instance{ get { BaseMethod(); return magic; } } public void BaseMethod(){ } //runs BaseMethod before being executed public void Method1(){ } //runs BaseMethod before being executed public void Method2(){ } }
你想要的是AOP – 一些指向.NET C#AOP框架的链接:
我知道它不会直接回答这个问题。 但是使用装饰器模式来解决这个问题以使您的实现保持清洁是一个很好的方法。
创建一个界面
public interface IMagic { public void Method1() { } public void Method2() { } }
创建实现
public class Magic : IMagic { public void Method1() { } public void Method2() { } }
创建装饰器
public class MagicDecorator : IMagic { private IMagic _magic; public MagicDecorator(IMagic magic) { _magic = magic; } private void BaseMethod() { // do something important } public void Method1() { BaseMethod(); _magic.Method1(); } public void Method2() { BaseMethod(); _magic.Method2(); } }
用法
var magic = new MagicDecorator(new Magic()); magic.Method1(); magic.Method2();
只是为了清楚说明为什么以下实现不起作用 :
public class Magic{ private static Magic magic = new Magic(); public static Magic Instance{ get { magic.BaseMethod(); return magic; } } public void BaseMethod(){ } //runs BaseMethod before being executed public void Method1(){ } //runs BaseMethod before being executed public void Method2(){ } }
在你想要持有Magic
对象的情况下,该方法将被随机调用:
Magic m = Magic.Instance; //this will trigger unwanted call on BaseMethod
如果有人想要调用BaseMethod
,它将被调用两次:
Magic.Instance.BaseMethod(); //two calls of the BaseMethod
当然有一个解决方法,使用get返回不需要的对象:
var unused = Magic.Instance;
只是总结一下: 这在C#中是不可能的(至少现在) 。