C # Fire event after return

I have a method Logthat creates an object LogMessageand fires an eventOnMessage

The method returns the object LogMessageafter the call event.

Is it possible to delay the event, so it happens after the return statement?

I need this because I want to be able to modify the object LogMessagebefore the event goes up.

public class Logger
{
    public static event LogMessageCreatedEventHandler OnMessage;

    public LogMessage Log(string logLevel, string message)
    {
        LogMessage logMessage = new LogMessage
        {
            Message = message,
            LogLevel = logLevel,
            DateTime = DateTime.UtcNow
        };

        OnMessage?.Invoke(this, new LogMessageCreatedEventArgs { LogMessage = logMessage });

        return logMessage;
    }
}


// usage

var logMessage = _logger.Log("Debug", "Product has been created");  <-- the event is invoked now
logMessage.CustomProp.Add("isProductsService", true);               <-- this property is not available in the Event Handler

One idea would be to use Task.Delay(), but I don't think this is a good solution.

Task.Delay(1000).ContinueWith(_ => {
    OnMessage?.Invoke(this, new LogMessageCreatedEventArgs { LogMessage = logMessage });
});

return message;
+4
source share
1 answer

Task.Delay(1000) . , return , LogMessage, .

, , - . :

public static event LogMessageCreatedEventHandler OnMessage;
// By default message preprocessor does nothing
public static Func<LogMessage,LogMessage> Preprocess { get; set; } = m => m;

public LogMessage Log(string logLevel, string message) {
    LogMessage logMessage = new LogMessage {
        Message = message,
        LogLevel = logLevel,
        DateTime = DateTime.UtcNow
    };
    OnMessage?.Invoke(this, new LogMessageCreatedEventArgs {
        LogMessage = Preprocess(logMessage)
    });
    return logMessage;
}

Logger, LogMessage:

Logger.Preprocessor = lm => {
    lm.PropertyToBeChanged = newPropertyValue;
    lm.AnotherProperty = someOtherValue;
    return lm;
};

"" , , , .

Func Log :

private static readonly Func<LogMessage,LogMessage> doNothing = m => m;
public LogMessage Log(string logLevel, string message, Func<LogMessage,LogMessage> preprocess = doNothing) {
    LogMessage logMessage = new LogMessage {
        Message = message,
        LogLevel = logLevel,
        DateTime = DateTime.UtcNow
    };
    OnMessage?.Invoke(this, new LogMessageCreatedEventArgs {
        LogMessage = preprocess(logMessage)
    });
    return logMessage;
}
+4
source

Source: https://habr.com/ru/post/1694109/


All Articles