C# 中可以通过属性存在进行模式匹配吗?

问题描述 投票:0回答:1

假设我们有这个示例层次结构:

abstract class Shape { }

class Circle : Shape 
{ 
    public int Radius { get; set; } 
}

class Rectangle : Shape 
{ 
    public int A { get; set; } 
    public int B { get; set; } 
}

我想知道是否可以在 C# 中对类型为

Shape
的变量使用模式匹配来确定它是否具有属性 Radius,例如

// Imaginary syntax
if (myShape is { int Radius} )
{
}

我还没有发现这是可能的,所以我认为答案是否定的,但可能有人更了解。

我能想到的替代方案:

  1. 列举所有已知的场景(即圆形类型等),缺点是将来引入新类型会打破它
  2. 引入接口,根据场景不同可能会比较麻烦
  3. 使用反射(不太好)
c# pattern-matching
1个回答
0
投票

C# 不是脚本语言。

这样不行。

它的工作方式要好得多。

对于示例中的特定类,您将使用以下内容:

if( myShape is Circle myCircleShape )
{
    do something with myCircleShape.Radius
}

如果您有更多带有半径的形状,请使它们全部派生自仅具有半径的公共基类。

如果你的继承树变得非常复杂,以至于无法使用单一继承来表示,那么就开始引入接口。

© www.soinside.com 2019 - 2024. All rights reserved.