Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 模式匹配具有相同操作的多个案例_.net Core_Polymorphism_Pattern Matching - Fatal编程技术网

.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)