Introducing C# 10: Extended property patterns
Introduction
C# 8 has introduced a new pattern: Property pattern. This pattern enables you to match on properties of the object examined, if you missed that feature, here is the Microsoft documentation here: Property pattern. C# 10 improves that pattern by simplifying access to nested properties. In the article I’ll show what it is.
Example
The following code sample shows a C# 8 tax calculator, which involves an object named CalculateTax and its nested property named ProvinceOrStateTaxProperty which is itself an object:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace DemoCsharp9 | |
{ | |
public class ProvinceOrStateTaxProperty | |
{ | |
public string ProvinceOrState { get; set; } | |
} | |
public class CalculateTax | |
{ | |
public string CountryName { get; set; } | |
public ProvinceOrStateTaxProperty ProvinceTaxProperty { get; set; } | |
} | |
public class Computing | |
{ | |
private static decimal ComputePrice(CalculateTax calculate, decimal price) => | |
calculate switch | |
{ | |
{ ProvinceTaxProperty: { ProvinceOrState: "Québec" } } => 1.14975M * price, | |
{ ProvinceTaxProperty: { ProvinceOrState: "Alberta" } } => 1.05M * price, | |
{ ProvinceTaxProperty: { ProvinceOrState: "Ontario" } } => 1.13M * price, | |
_ => 0 | |
}; | |
} | |
} |
The syntax to access the nested property is a bit verbose:
{ ProvinceTaxProperty: { ProvinceOrState: "Value" } }
C# 10 fixes that and allows to access directly the nested property by a dot:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace DemoCsharp10 | |
{ | |
public class ProvinceOrStateTax | |
{ | |
public string ProvinceOrState { get; set; } | |
} | |
public class CountryTax | |
{ | |
public string CountryName { get; set; } | |
public ProvinceOrStateTax ProvinceTaxProperty { get; set; } | |
} | |
public class Computing | |
{ | |
private static decimal ComputePrice(CountryTax calculate, decimal price) => | |
calculate switch | |
{ | |
{ ProvinceTaxProperty.ProvinceOrState: "Québec" } => 1.14975M * price, | |
{ ProvinceTaxProperty.ProvinceOrState: "Alberta" } => 1.05M * price, | |
{ ProvinceTaxProperty.ProvinceOrState: "Ontario" } => 1.13M * price, | |
_ => 0 | |
}; | |
} | |
} |
Much more practical isn’t it ?