gpt4 book ai didi

c# - 最接近 F# 匹配表达式的 C#?

转载 作者:太空狗 更新时间:2023-10-29 19:49:32 24 4
gpt4 key购买 nike

我的情况是我的很多类都是众所周知但无序的不同类型对象的容器,例如容器可能如下所示:

public class Container
{
public A A { get; private set; }
public B B { get; private set; }
public C C { get; private set; }

public bool StoreIfKnown(object o)
{
// TODO...
}
}

所以如果oA类型,它应该存储在A属性中,类型BB 属性等。

在 F# 中,StoreIfKnown 方法可以像下面这样写(请原谅语法错误,我的 F# 不是很好而且很生疏):

match o with
| ?: A a -> A <- a; true
| ?: B b -> B <- b; true
| ?: C c -> C <- c; true
| _ -> false

但在 C# 中,唯一的方法似乎相当冗长:

if (o is A)
{
this.A = (A)o;
return true;
}

if (o is B)
{
this.B = (B)o;
return true;
}

// etc.

return false;

我可以使用 as 关键字来避免测试/转换模式,这会更快,但更冗长。

在 C# 中有什么优雅的方法可以做到这一点吗?

最佳答案

您可以在“o”和辅助类上编写扩展方法以启用类似这样的编程模型

o.Match<A>( a => { this.A = a; return true; } )
.Match<B>( b => { this.B = b; return true; } )
.Else( () => { return false; } )

但是要小心不要在这里做太多类似 DSL 的黑客行为,以免你最终得到一个只有你理解的 API。

另见

http://blogs.msdn.com/lucabol/archive/2008/07/15/a-c-library-to-write-functional-code-part-v-the-match-operator.aspx

关于c# - 最接近 F# 匹配表达式的 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1509172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com