相关疑难解决方法(0)

C#开启类型

可能重复:
C# - "开启类型"有比这更好的选择吗?

C#不支持切换对象的类型.模拟这个的最佳模式是什么:

switch (typeof(MyObj))
    case Type1:
    case Type2:
    case Type3:
Run Code Online (Sandbox Code Playgroud)

谢谢!

c#

163
推荐指数
3
解决办法
17万
查看次数

开关/模式匹配的想法

我最近一直在关注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-statement

148
推荐指数
7
解决办法
2万
查看次数

使用Case/Switch和GetType来确定对象

可能重复:
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()到类型?

.net c# reflection case switch-statement

143
推荐指数
9
解决办法
20万
查看次数

if语句中的赋值

我有一个类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# casting if-statement

133
推荐指数
6
解决办法
6万
查看次数

nameof()是在编译时评估的吗?

在C#6中,您可以使用nameof()运算符来获取包含变量名称或类型的字符串.

这是在编译时评估,还是在运行时通过一些Roslyn API评估?

c# roslyn c#-6.0

112
推荐指数
2
解决办法
1万
查看次数

如何在程序集中查找从特定类型C#继承的所有类型

如何获得从特定其他类型继承的所有类型的集合?

c# reflection

90
推荐指数
2
解决办法
4万
查看次数

什么是更快,打开字符串或elseif类型?

假设我可以选择在字符串比较的基础上识别代码路径,或者如果确定类型:

哪个更快,为什么?

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语句中使用变量?

警告:我是后期优化的.这种方法被称为许多在应用程序的缓慢一部分倍.

c# performance

75
推荐指数
5
解决办法
5万
查看次数

C#泛型和类型检查

我有一个使用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# generics types

72
推荐指数
5
解决办法
9万
查看次数

切换案例类型为c#

可能重复:
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)

}

.net c# optimization switch-statement

60
推荐指数
5
解决办法
9万
查看次数

在C#中切换案例 - 预期是一个常量值

我的代码如下:

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# switch-statement

50
推荐指数
6
解决办法
13万
查看次数