从 MapResult 为 CommanLineParser 创建 ParserResult<T>

Create ParserResult<T> from MapResult for the CommanLineParser

我注意到 MapResult 没有 ParserResult<T> 的重载。有没有一种方法可以执行 MapResult 提供的相同功能,并且 return 一个 ParserResult<T> 而不仅仅是一个对象,或者我是否必须克隆 repo 并将此功能自己添加到扩展 class?

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

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

解决方案?

谢谢

好的,

我有点赶时间,所以我最终克隆了 repo 并向 ParserResultExtensions 文件添加了一个扩展方法。

由于原始方法被称为 MapResult<T>,我只是添加了一个名为 MapParserResult<T> 的新方法,returns T 包裹在 Parsed<T>NotParsed<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 将这个扩展方法添加到他们的代码库中,这样其他人就可以复制这个行为而不必克隆 repo。