Подписка на IObservable<T> без делегата типа

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

namespace exampleExcelAddin.Common.Services
{
    public class LogEntry
    {
        public Type Type;
        public string Message;
        public IDictionary<string, object> Meta = new Dictionary<string, object>();
    }

    public interface ILogger
    {
        void LogMessage(string message);

        void LogMessage(Exception exception);
    }

    public static class Logger
    {
        readonly static Lazy<ISubject<LogEntry>> _outputStream = new Lazy<ISubject<LogEntry>>(() => {
            return new ReplaySubject<LogEntry>();
        });

        public static ILogger Create(Type loggerType) => new TypedLogger(loggerType, _outputStream.Value);

        public static IObservable<LogEntry> Output => _outputStream.Value;

        class TypedLogger : ILogger
        {
            readonly ISubject<LogEntry> outputStream;
            readonly Type loggerType;

            internal TypedLogger(Type loggerType, ISubject<LogEntry> outputStream)
            {
                this.loggerType = loggerType;
                this.outputStream = outputStream;
            }

            public void LogMessage(string message)
            {
                outputStream.OnNext(new LogEntry {
                    Type = loggerType,
                    Message = message
                });
            }

            public void LogMessage(Exception exception)
            {
                var logEntry = new LogEntry {
                    Type = loggerType,
                    Message = $"Exception: {exception.Message}"
                };

                logEntry.Meta.Add("StackTrace", exception.StackTrace);

                outputStream.OnNext(logEntry);
            }
        }
    }
}

Рабочий пример в vb.net выглядит так...

 Private Shared log As ILogger = Logger.Create(GetType(myRibbon))
 Logger.Output.Subscribe(
            Sub(entry)
                If MySettings.Default.EnableLogging Then

                    Dim logBuilder As New StringBuilder()
                    logBuilder.
                        AppendLine("-------------------------------------------------").
                        AppendLine($"Type: {entry.Type}").
                        AppendLine($"Message: {entry.Message}")

                    For Each meta In entry.Meta
                        logBuilder.
                            AppendLine($"Meta-Key: {meta.Key}").
                            AppendLine($"Meta-Value: {meta.Value}")
                    Next

                    logBuilder.
                        AppendLine("-------------------------------------------------" & Environment.NewLine)

                    IO.File.AppendAllText(logPath, logBuilder.ToString())
                End If
            End Sub)

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

Logger.Output.Subscribe(entry => {
                if (Settings.Default.EnableLogging) {
                    var logBuilder = new StringBuilder();
                    logBuilder.AppendLine("-------------------------------------------------").AppendLine($"Type: {entry.Type}").AppendLine($"Message: {entry.Message}");
                    foreach (var meta in entry.Meta) { logBuilder.AppendLine($"Meta-Key: {meta.Key}").AppendLine($"Meta-Value: {meta.Value}"); }
                    _ = logBuilder.AppendLine("-------------------------------------------------" + Environment.NewLine); System.IO.File.AppendAllText(logPath, logBuilder.ToString());
                    }
            });

Отвечает ли это на ваш вопрос? IObservable<> отсутствуют методы расширения .Subscribe

devNull 14.12.2020 05:59

К сожалению, нет, также пытался изучить этот вопрос: stackoverflow.com/questions/23247125/…

fassetar 14.12.2020 06:15

Какую ошибку вы получаете?

devNull 14.12.2020 06:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Разобрался, просто нужен пакет, который использует библиотека.

Install-Package System.Reactive -Version 5.0.0

Другие вопросы по теме