可能重复:
C# - "开启类型"有比这更好的选择吗?
C#不支持切换对象的类型.模拟这个的最佳模式是什么:
switch (typeof(MyObj))
case Type1:
case Type2:
case Type3:
Run Code Online (Sandbox Code Playgroud)
谢谢!
我最近一直在关注F#,虽然我不太可能在不久的将来跳过障碍,但它肯定会突出一些C#(或库支持)可以让生活更轻松的领域.
特别是,我正在考虑F#的模式匹配功能,它允许非常丰富的语法 - 比当前的开关/条件C#等价物更具表现力.我不会试图给出一个直接的例子(我的F#不符合它),但简而言之它允许:
虽然C#最终可以借用[ahem]丰富的一些内容,但是在过渡时期我一直在研究可以在运行时做些什么 - 例如,将一些对象拼凑起来相当容易:
var getRentPrice = new Switch<Vehicle, int>()
.Case<Motorcycle>(bike => 100 + bike.Cylinders * 10) // "bike" here is typed as Motorcycle
.Case<Bicycle>(30) // returns a constant
.Case<Car>(car => car.EngineType == EngineType.Diesel, car => 220 + car.Doors * 20)
.Case<Car>(car => car.EngineType == EngineType.Gasoline, car => 200 + car.Doors * 20)
.ElseThrow(); // or could use a Default(...) terminator
Run Code Online (Sandbox Code Playgroud)
其中getRentPrice是Func <Vehicle,int>.
[注意 - 也许这里的Switch/Case是错误的术语......但它显示了这个想法]
对我来说,这比使用重复的if/else或者复合三元条件(对于非平凡的表达式变得非常混乱 - 括号丰富)的等价物要清楚得多.它还避免了大量的转换,并允许简单扩展(直接或通过扩展方法)到更具体的匹配,例如InRange(...)匹配可比VB选择...案例"x到y "用法.
我只是想测量一下,如果人们认为上述结构有很多好处(在没有语言支持的情况下)?
另外请注意,我一直在玩上述3种变体: …
可能重复:
C# - "开启类型"有比这更好的选择吗?
如果你想要switch
一种类型的对象,最好的方法是什么?
private int GetNodeType(NodeDTO node)
{
switch (node.GetType())
{
case typeof(CasusNodeDTO):
return 1;
case typeof(BucketNodeDTO):
return 3;
case typeof(BranchNodeDTO):
return 0;
case typeof(LeafNodeDTO):
return 2;
default:
return -1;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这不起作用,但我想知道如何解决这个问题.if/else
在这种情况下是否适用声明?
或者你使用开关并添加.ToString()
到类型?
我有一个类Animal
及其子类Dog
.我经常发现自己编写以下代码:
if (animal is Dog)
{
Dog dog = animal as Dog;
dog.Name;
...
}
Run Code Online (Sandbox Code Playgroud)
对于变量Animal animal;
.
是否有一些语法允许我写如下:
if (Dog dog = animal as Dog)
{
dog.Name;
...
}
Run Code Online (Sandbox Code Playgroud) 在C#6中,您可以使用nameof()
运算符来获取包含变量名称或类型的字符串.
这是在编译时评估,还是在运行时通过一些Roslyn API评估?
假设我可以选择在字符串比较的基础上识别代码路径,或者如果确定类型:
哪个更快,为什么?
switch(childNode.Name)
{
case "Bob":
break;
case "Jill":
break;
case "Marko":
break;
}
if(childNode is Bob)
{
}
elseif(childNode is Jill)
{
}
else if(childNode is Marko)
{
}
Run Code Online (Sandbox Code Playgroud)
更新:我问这个问题的主要原因是因为switch语句对于什么算是一个特例.例如,它不允许您使用变量,只允许移动到主程序集的常量.我认为它有这个限制,因为它正在做一些时髦的东西.如果它只是翻译成elseifs(作为一张海报评论)那么为什么我们不允许在case语句中使用变量?
警告:我是后期优化的.这种方法被称为许多在应用程序的缓慢一部分倍.
我有一个使用a IList<T>
作为参数的方法.我需要检查该T
对象的类型是什么,并根据它做一些事情.我试图使用该T
值,但编译器不允许它.我的解决方案如下:
private static string BuildClause<T>(IList<T> clause)
{
if (clause.Count > 0)
{
if (clause[0] is int || clause[0] is decimal)
{
//do something
}
else if (clause[0] is String)
{
//do something else
}
else if (...) //etc for all the types
else
{
throw new ApplicationException("Invalid type");
}
}
}
Run Code Online (Sandbox Code Playgroud)
必须有更好的方法来做到这一点.有什么方法可以检查T
传入的类型然后使用switch
语句?
可能重复:
C# - "开启类型"有比这更好的选择吗?
你好假设我在类类型上得到一个很大的if/else.有没有办法用开关盒做到这一点?
示例:
function test(object obj)
{
if(obj is WebControl)
{
}else if(obj is TextBox)
{
}
else if(obj is ComboBox)
{
}
Run Code Online (Sandbox Code Playgroud)
等......
我想创造类似的东西
switch(obj)
{
case is TextBox:
break;
case is ComboBox:
break;
}
Run Code Online (Sandbox Code Playgroud)
}
我的代码如下:
public static void Output<T>(IEnumerable<T> dataSource) where T : class
{
dataSourceName = (typeof(T).Name);
switch (dataSourceName)
{
case (string)typeof(CustomerDetails).Name.ToString(); :
var t = 123;
break;
default:
Console.WriteLine("Test");
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.case语句给出了一个错误,说明了一个常量变量.请大家帮忙谢谢!
c# ×10
.net ×2
reflection ×2
c#-6.0 ×1
case ×1
casting ×1
generics ×1
if-statement ×1
optimization ×1
performance ×1
roslyn ×1
types ×1