Вход входа и выхода методов наряду с параметрами автоволшебно?

В большинстве примеров вы увидите, что чтение файла YAML с диска выполняется с помощью:

yaml = ruamel.yaml.YAML()
with open('config.yaml') as fp:
    yaml.load(fp)

Это открытие - открытие для чтения (аналогично выполнению open("config.yaml", "r")). Это хорошо в Linux или в Windows при использовании ASCII / текстовых файлов. Но для того, чтобы синтаксический анализатор YAML правильно обрабатывал ввод не-ASCII в Windows, вы должны открыть файл в режиме чтения в двоичном формате:

yaml = ruamel.yaml.YAML()
with open('config.yaml', 'rb') as fp:
    yaml.load(fp)
9
задан Xerx 5 October 2008 в 01:02
поделиться

5 ответов

Лучший способ достигнуть этого вида вещи при помощи перехвата, существует несколько способов сделать это, хотя они все имеют тенденцию быть несколько агрессивными. Нужно было бы получить все Ваши объекты из ContextBoundObject. Вот пример использования этого вида подхода. Другой подход должен был бы пользоваться одной из существующих библиотек AOP для достижения этого. Что-то как DynamicProxy из Проекта Замка в ядре многих из них. Вот несколько ссылок: Spring. Сеть PostSharp Cecil

Существует, вероятно, несколько других, и я знаю замок Windsor и Ninject, который оба обеспечивают возможностям AOP сверх функциональности МОК.

После того как AOP существует, Вы просто записали бы класс перехватчика, который запишет информацию о вызовах метода log4net.

Я на самом деле не был бы удивлен, даст ли одна из платформ AOP Вам такую функциональность из поля.

8
ответ дан 4 December 2019 в 11:09
поделиться

Я не уверен, каковы Ваши фактические потребности, но вот опция низкой арендной платы. Это не точно "автоматически", но Вы могли использовать StackTrace для снимания с информации, которую Вы ищете способом, который не потребовал бы передающие аргументы - подобный предложению ckramer относительно перехвата:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Diagnostics;

namespace TracingSample
{
    class Program
    {
        static void Main(string[] args)
        {
            DoSomething();
        }

        static void DoSomething()
        {
            LogEnter();

            Console.WriteLine("Executing DoSomething");

            LogExit();
        }

        static void LogEnter()
        {
            StackTrace trace = new StackTrace();
            if (trace.FrameCount > 1)
            {
                string ns = trace.GetFrame(1).GetMethod().DeclaringType.Namespace;
                string typeName = trace.GetFrame(1).GetMethod().DeclaringType.Name;
                Console.WriteLine("Entering {0}.{1}.{2}", ns, typeName, trace.GetFrame(1).GetMethod().Name);
            }
        }

        static void LogExit()
        {
            StackTrace trace = new StackTrace();
            if (trace.FrameCount > 1)
            {
                string ns = trace.GetFrame(1).GetMethod().DeclaringType.Namespace;
                string typeName = trace.GetFrame(1).GetMethod().DeclaringType.Name;
                Console.WriteLine("Exiting {0}.{1}.{2}", ns, typeName, trace.GetFrame(1).GetMethod().Name);
            }
        }
    }
}

Вы могли объединить что-то как вышеупомянутый пример с наследованием, с помощью невиртуального общедоступного участника в базовом типе для выражения метода действия, затем звоня виртуальному участнику, чтобы на самом деле сделать работу:

public abstract class BaseType
{
    public void SomeFunction()
    {

        LogEnter();
        DoSomeFunction();
        LogExit();
    }

    public abstract void DoSomeFunction();
}

public class SubType : BaseType
{
    public override void DoSomeFunction()
    {
        // Implementation of SomeFunction logic here...
    }
}

Снова - там не является очень "автоматическим" об этом, но это работало бы на ограниченной основе, если бы Вы не потребовали инструментария на каждом вызове метода.

Надеюсь, это поможет.

4
ответ дан 4 December 2019 в 11:09
поделиться

Взгляните на:

Как я прерываю вызов метода в C#? PostSharp - il переплетающийся - мысли

Также ищите ТАК 'AOP' или 'Аспектно-ориентированное программирование' и PostSharp... Вы получаете некоторые интересные результаты.

4
ответ дан 4 December 2019 в 11:09
поделиться

Вы могли использовать посткомпилятор как Пострезкий. Образец с веб-сайта говорит об установке трассировщика для ввода/выхода метода, который очень похож на то, что Вы хотите.

3
ответ дан 4 December 2019 в 11:09
поделиться

Шаблон "декоратор" может помочь.

0
ответ дан 4 December 2019 в 11:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: