C# 8.0 基于输入类型的 switch 表达式
C# 8.0 switch expression based on input type
是否可以根据输入类型在 C# 8 中创建 switch expression
?
我的输入 类 如下所示:
public class A1
{
public string Id1 {get;set}
}
public class A2 : A1
{
public string Id2 {get;set}
}
public class A3 : A1
{
public string Id3 {get;set;}
}
我想 运行 基于输入类型的不同方法(A1
、A2
或 A3
):
var inputType = input.GetType();
var result = inputType switch
{
inputType as A1 => RunMethod1(input); // wont compile,
inputType as A2 => RunMethod2(input); // just showing idea
inputType as A3 => RunMethod3(input);
}
但这行不通。关于如何根据输入类型创建开关或开关表达式有什么想法吗?C
您可以使用模式匹配,首先检查最具体的类型。
GetType
是不必要的:
var result = input switch
{
A2 _ => RunMethod1(input),
A3 _ => RunMethod2(input),
A1 _ => RunMethod3(input)
};
但是,更面向对象的方法是在类型本身上定义一个方法:
public class A1
{
public string Id1 { get; set; }
public virtual void Run() { }
}
public class A2 : A1
{
public string Id2 { get; set; }
public override void Run() { }
}
那么就是:
input.Run();
可以,但是在这样的继承层次结构中,您需要从最具体的开始,然后向下移动到最少的:
A1 inputType = new A2();
var result = inputType switch
{
A3 a3 => RunMethod(a3),
A2 a2 => RunMethod(a2),
A1 a1 => RunMethod(a1)
};
注意
inputType
是实例,不是 Type
的实例
inputType
被键入为基础 class 但可以是任何 A1-3 的实例。否则你会得到一个编译器错误。
是否可以根据输入类型在 C# 8 中创建 switch expression
?
我的输入 类 如下所示:
public class A1
{
public string Id1 {get;set}
}
public class A2 : A1
{
public string Id2 {get;set}
}
public class A3 : A1
{
public string Id3 {get;set;}
}
我想 运行 基于输入类型的不同方法(A1
、A2
或 A3
):
var inputType = input.GetType();
var result = inputType switch
{
inputType as A1 => RunMethod1(input); // wont compile,
inputType as A2 => RunMethod2(input); // just showing idea
inputType as A3 => RunMethod3(input);
}
但这行不通。关于如何根据输入类型创建开关或开关表达式有什么想法吗?C
您可以使用模式匹配,首先检查最具体的类型。
GetType
是不必要的:
var result = input switch
{
A2 _ => RunMethod1(input),
A3 _ => RunMethod2(input),
A1 _ => RunMethod3(input)
};
但是,更面向对象的方法是在类型本身上定义一个方法:
public class A1
{
public string Id1 { get; set; }
public virtual void Run() { }
}
public class A2 : A1
{
public string Id2 { get; set; }
public override void Run() { }
}
那么就是:
input.Run();
可以,但是在这样的继承层次结构中,您需要从最具体的开始,然后向下移动到最少的:
A1 inputType = new A2();
var result = inputType switch
{
A3 a3 => RunMethod(a3),
A2 a2 => RunMethod(a2),
A1 a1 => RunMethod(a1)
};
注意
inputType
是实例,不是Type
的实例
inputType
被键入为基础 class 但可以是任何 A1-3 的实例。否则你会得到一个编译器错误。