首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >订阅IObservable<T>而不是类型委托

订阅IObservable<T>而不是类型委托
EN

Stack Overflow用户
提问于 2020-12-14 12:09:53
回答 1查看 68关注 0票数 0

我继承了一个开发人员的代码,我想把它转换成C#,因为他的库是用c#编写的。然而,我只有一个例子告诉我如何订阅这个服务是在vba中,我不知道它是如何附加到它的。

代码语言:javascript
复制
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中的工作示例如下所示...

代码语言:javascript
复制
 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)

我在转换它时得到了一些帮助,我的lambda表达式一直有问题,因为它不是我理解的委托类型,但一直在碰壁。从我的元素中了解如何使用这些服务。

代码语言:javascript
复制
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());
                    }
            });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-30 05:10:43

弄清楚了,只需要一个库使用的包。

代码语言:javascript
复制
Install-Package System.Reactive -Version 5.0.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65283479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档