C# 平面图判别并集
我正在使用Github上的一个lib,名为 基本上,您有一种类型可以是多种类型中的一种,但以静态安全的方式 下面是我努力实现的一个例子。C# 平面图判别并集,c#,C#,我正在使用Github上的一个lib,名为 基本上,您有一种类型可以是多种类型中的一种,但以静态安全的方式 下面是我努力实现的一个例子。 我有类型A,类型B,我想将类型B“flapmap”到类型A中。因为类型A可以接受来自B的任何单个T,这应该是可能的 编译器强制我在将T分配给A之前从B中提取每个T,正如下面愚蠢的x=>xlambdas所示 我也不想以类似A的东西结束。 那么,有人能想出一个基本上是针对这些类型的SelectMany吗 using OneOf; using System; usi
我有类型
A
,类型B
,我想将类型B“flapmap”到类型A中。因为类型A可以接受来自B的任何单个T,这应该是可能的
编译器强制我在将T分配给A之前从B中提取每个T,正如下面愚蠢的x=>x
lambdas所示
我也不想以类似A
的东西结束。那么,有人能想出一个基本上是针对这些类型的SelectMany吗
using OneOf;
using System;
using System.IO;
namespace ScratchPad
{
class Program
{
struct BadRequest { }
struct Error { }
struct NotFound { }
static void Main(string[] arg)
{
string result = GetFile(@"c:\data\foo.txt").Match(
text => text,
badRequest => "filepath cannot be null",
notFound => "filepath does not exist",
error => "an error occurred"
);
Console.WriteLine(result);
}
static OneOf<string, BadRequest, NotFound, Error> GetFile(string filepath)
{
OneOf<string, BadRequest, NotFound, Error> response = new BadRequest();
if (filepath != null)
{
// How can I make the type from ReadText() automatically convert to the type of the response local variable, without having to write these silly lambda?
response = ReadText(filepath).Match<OneOf<string, BadRequest, NotFound, Error>>(x => x, x => x, x => x);
}
return response;
}
static OneOf<string, NotFound, Error> ReadText(string filepath)
{
OneOf<string, NotFound, Error> response = new NotFound();
try
{
if (File.Exists(filepath))
{
response = File.ReadAllText(filepath);
}
}
catch
{
response = new Error();
}
return response;
}
}
}
使用其中一个;
使用制度;
使用System.IO;
名称空间草稿行
{
班级计划
{
结构BadRequest{}
结构错误{}
未找到结构{}
静态void Main(字符串[]arg)
{
string result=GetFile(@“c:\data\foo.txt”).Match(
text=>text,
badRequest=>“文件路径不能为空”,
notFound=>“文件路径不存在”,
error=>“发生了一个错误”
);
控制台写入线(结果);
}
GetFile的静态文件(字符串文件路径)
{
响应之一=新的坏请求();
if(filepath!=null)
{
//如何使ReadText()中的类型自动转换为响应局部变量的类型,而不必编写这些愚蠢的lambda?
response=ReadText(filepath).Match(x=>x,x=>x,x=>x);
}
返回响应;
}
ReadText(字符串文件路径)的静态值
{
响应之一=新的未找到();
尝试
{
if(File.Exists(filepath))
{
response=File.ReadAllText(文件路径);
}
}
抓住
{
响应=新错误();
}
返回响应;
}
}
}
扩展方法可能是一种方法
举个例子,我脑子里刚想出来,将3种类型转换为4种类型:
public static class OneOfExtensions
{
public static OneOf<T1, T2, T3, T4> ConvertOneOf<T1, T2, T3, T4>(this OneOf<T1, T2, T3> oneOf)
{
return oneOf.Match<OneOf<T1, T2, T3, T4>>(x => x, x => x, x=> x);
}
public static OneOf<T1, T2, T3, T4> ConvertOneOf<T1, T2, T3, T4>(this OneOf<T1, T2, T4> oneOf)
{
return oneOf.Match<OneOf<T1, T2, T3, T4>>(x => x, x => x, x=> x);
}
public static OneOf<T1, T2, T3, T4> ConvertOneOf<T1, T2, T3, T4>(this OneOf<T1, T3, T4> oneOf)
{
return oneOf.Match<OneOf<T1, T2, T3, T4>>(x => x, x => x, x=> x);
}
public static OneOf<T1, T2, T3, T4> ConvertOneOf<T1, T2, T3, T4>(this OneOf<T2, T3, T4> oneOf)
{
return oneOf.Match<OneOf<T1, T2, T3, T4>>(x => x, x => x, x=> x);
}
}
publicstaticclass-OneOfExtensions
{
ConvertOneOf的公共静态OneOf(此OneOf)
{
返回其中一个.Match(x=>x,x=>x,x=>x);
}
ConvertOneOf的公共静态OneOf(此OneOf)
{
返回其中一个.Match(x=>x,x=>x,x=>x);
}
ConvertOneOf的公共静态OneOf(此OneOf)
{
返回其中一个.Match(x=>x,x=>x,x=>x);
}
ConvertOneOf的公共静态OneOf(此OneOf)
{
返回其中一个.Match(x=>x,x=>x,x=>x);
}
}
它不是特别漂亮,但它应该保持代码相对干净