从 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。
我注意到 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。