Позволяет вызывать методы класса определенным образом

#c# #attributes

#c# #атрибуты

Вопрос:

Что я хотел бы иметь возможность сделать, так это добавить атрибут к определенным методам класса, чтобы эти методы, оформленные таким образом, могли вызывать инструкции в своем теле так, как мне нравится.

Например, рассмотрим этот сценарий на 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, чтобы я знал, что нужно вызывать его операторы body дважды. Возможно ли это в C #?

Комментарии:

1. Мне любопытно, чего вы пытаетесь достичь, делая это? На первый взгляд, это просто усложняет понимание кода. Какова цель?

2. Я пытаюсь выяснить, возможно ли декларативно отделить реализацию метода от способа вызова метода. Таким образом, если мне нужно изменить способ вызова метода, мне нужно всего лишь изменить атрибут реализации, которым оформлен метод, а не изменять сам метод.

Ответ №1:

Почему бы просто не сделать 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().");
}
}
  

Комментарии:

1. вы могли бы даже указать параметр для Func1, указывающий, сколько раз его запускать…

Ответ №2:

Вы можете заставить Func1 рекурсивно вызывать себя, уменьшая переменную count для каждого вызова.

Ответ №3:

Я не знаю, помогает ли это в данном случае, но PostSharp позволяет вам украшать методы атрибутами для специальных целей.

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

Комментарии:

1. Да, я думал об аспектно-ориентированном программировании как о решении проблемы. Но, похоже, то, что вы предлагаете, позволяет мне только добавить дополнительную функциональность к методу, а не вызывать его несколько раз.