2011-06-12 23 views
0

我希望能够做的是将属性添加到类的特定方法,以便那些如此装饰的方法可以在其中调用正文中的语句我喜欢的方式。启用以特定方式调用的类方法

例如,请考虑这种情况在C#:

public class A 
    { 
    public A() {} 

    [CallTwice()] 
    public void Func1() 
    { 
     Console.WriteLine("Calling Func1()."); 
    } 

    public void Func2() 
    { 
     Console.WriteLine("Calling Func2()."); 
    } 
} 

我想这样一个场景,如果我这样做:

public static void Main() 
{ 
    A a = new A(); 
    a.Func1(); 
    a.Func2(); 
} 

我会得到这样的输出:

Calling A.Func1(). 
Calling A.Func1(). 
Calling A.Func2(). 

即我的装饰Func1使它被调用两次。

我想知道的是,我如何编写代码来利用我给Func1的具体装饰,以便我知道两次调用它的正文语句。这在C#中可能吗?

+0

我很好奇你在做什么?表面上,它只是使代码更难以遵循。目标是什么? – Khepri 2011-06-12 05:05:12

+0

我想知道是否有可能声明地分离一个方法的实现从如何调用方法。这样,如果我需要改变方法的调用方式,我只需要改变方法的实现属性,而不是改变方法本身。 – 2011-06-12 16:24:34

回答

3

为什么不简单地使Func1变得私人或受保护,并且制造不同的方法,调用Func1两次?

public class A 
{ 
public A() {} 

public void Func1() 
{ 
    Func1Core(); 
    Func1Core(); 
} 

private void Func1Core() 
{ 
    Console.WriteLine("Calling Func1()."); 
} 

public void Func2() 
{ 
    Console.WriteLine("Calling Func2()."); 
} 
} 
+0

你甚至可以为Func1指定参数,告诉它运行它多少次...... – PedroC88 2011-06-12 05:05:06

0

您可以通过递减每次调用的计数变量来使Func1递归调用自身。

0

我不知道在这种情况下是否有帮助,但PostSharp允许您修饰具有特殊用途属性的方法。

http://www.sharpcrafters.com/postsharp/documentation

+0

是的,我曾经想过面向方面编程作为解决这个问题的方法。但它看起来像你所建议的只允许我为该方法添加额外的功能,而不是多次调用它。 – 2011-06-12 16:28:08