0

我注意到 MapResult 没有重载ParserResult<T>. 有没有办法执行 MapResult 提供的相同功能,并返回一个ParserResult<T>而不仅仅是一个对象,或者我是否必须克隆存储库并将此功能自己添加到扩展类中?

让我解释一下我想要做什么。我需要将旧选项映射到新模型。因此,与其在各处更改已部署的签名,我只想将旧模型映射到新模型,并且仍然ParserResult<T>照常使用。我看到的问题是我可以使用 MapResult 将旧模型映射到新模型,但是我需要ParserResult<T>为新模型返回。的所有构造函数ParserResult<T>都是内部的,并且包含密封参数。所以我不能只是新建一个ParserResult<T>.

您建议执行哪些选项来执行此类操作。看起来我不会是唯一一个需要这样的东西的人。我宁愿不必克隆存储库来添加此功能。

解决方案?

谢谢

4

1 回答 1

0

好吧,

我对这个有点着急,所以我最终克隆了 repo 并向 ParserResultExtensions 文件添加了一个扩展方法。

由于调用了原始方法MapResult<T>,因此我只是添加了一个名为的新方法MapParserResult<T>,该方法返回包装在一个Parsed<T>NotParsed<T>对象中的 T。由于Parsed<T>NotParsed<T>都源自ParseResult<T>,因此它可以正常工作。

这是我添加的代码:

`

public static ParserResult<TResult> MapParserResult<TSource, TResult>(this ParserResult<TSource> result, Func<TSource, TResult> parsedFunc, Func<IEnumerable<Error>, TResult> notParsedFunc)
{
     var parsed = result as Parsed<TSource>;
     if (parsed != null)
     {
         return new Parsed<TResult>(parsedFunc(parsed.Value));
     }
     return new NotParsed<TResult>(TypeInfo.Create(typeof(TResult)),((NotParsed<TSource>)result).Errors);
}

`

我希望有人发现这很有用甚至更好,CommandLineParser 将此扩展方法添加到他们的代码库中,以便其他人可以复制此行为而无需克隆存储库。

于 2022-01-13T03:17:15.130 回答