.net core 模式匹配具有相同操作的多个案例
你好,我有一个.net core 模式匹配具有相同操作的多个案例,.net-core,polymorphism,pattern-matching,.net Core,Polymorphism,Pattern Matching,你好,我有一个abstract类和2个派生类。层次结构的性质使我处于一个不希望出现的位置,派生的成员共享一个公共属性,但超类没有。 因此,虽然我有两个具有公共属性的派生类,但我需要在switch语句中进行模式匹配,这两种情况下和对它们应用相同的操作: public abstract class Base { } public D1:Base{ public long Value{get;set;} public void SetValue(long val){ th
abstract
类和2个派生类。层次结构的性质使我处于一个不希望出现的位置,派生的成员共享一个公共属性,但超类没有。
因此,虽然我有两个具有公共属性的派生类,但我需要在switch
语句中进行模式匹配,这两种情况下和对它们应用相同的操作:
public abstract class Base
{
}
public D1:Base{
public long Value{get;set;}
public void SetValue(long val){
this.Value=val;
}
}
public D2:Base
{
public long Value{get;set;}
public void SetValue(long val)
{
this.Value=val;
}
}
public void PaternMatch(Base base)
{
long val=5;
switch(base)
{
case D1 d1:
case D2 d2:
//how can i say something like apply `SetValue regardless if its d1 or d2?
d1.SetValue(val)?
break;
}
更新当有多个案例执行相同操作时,是否有任何构造允许我获取类型
case string:
case int:
case double:
Console.WriteLine("the option that matched was:"+[ option name of or value ]`);
在上述情况下,我可以知道string
匹配,还是int?或者至少得到一个匹配的索引<代码>0-string
,1-int
,2-double
公共类程序
{
公共静态void Main(字符串[]args)
{
var d1=新的d1();
模式匹配(d1);
Assert(d1.Value.Equals(5));
控制台写入线(d1值);
var d2=新的d2();
模式匹配(d2);
Assert(d2.Value.Equals(5));
控制台写入线(d2值);
var d3=新的d3();
模式匹配(d3);
Assert(d3.Value.Equals(105));
控制台写入线(d3值);
Console.ReadKey();
}
公共静态无效模式匹配(基于)
{
长val=5;
交换机(基于)
{
//第一种情况为自类,然后检查为d1或d2。。。
当@base为D1时,基于大小写的@base;@base为D2时:
//然后,因为base没有实现SetValue方法,我们需要转换到D1或D2并调用SetValue(val);
开关(@base)
{
案件D1:
d1.设定值(val);
打破
案件D2:
d2.设定值(val);
打破
}
打破
案例D3和D3:
d3.设定值(val);
打破
}
}
}
基于公共抽象类的
{
}
公开课D1:基于
{
公共长值{get;private set;}
公共无效设置值(长值)
{
这个值=val;
}
}
公开课D2:基于
{
公共长值{get;private set;}
公共无效设置值(长值)
{
这个值=val;
}
}
公共类D3:基于
{
公共长值{get;private set;}
公共无效设置值(长值)
{
该值=val+100;
}
}
Hi,查看文档中的“when”关键字:我不知道如何使用它。在我的情况下,没有额外的条件上的加工情况。我有2个情况,我希望相同的行动,以适用于(虽然不同)。我可以不知何故不做内部开关?我能推断出如果@base是d1d
@bercoviciarian,我在没有内部开关的情况下试过:当@base是d1d1时| |@base是d2d2:D1?.SetValue(val);d2?设定值(val)但编译器说d1和d2并没有实例化。。。我不知道为什么:)可能是个bug。)