34

我怎样才能使这项工作?

switch(property.PropertyType){
    case typeof(Boolean): 
        //doStuff
        break;
    case typeof(String): 
        //doOtherStuff
        break;
    default: break;
}

我不想使用该名称,因为类型的字符串比较非常糟糕,并且可能会发生变化。

4

10 回答 10

63
        System.Type propertyType = typeof(Boolean);
        System.TypeCode typeCode = Type.GetTypeCode(propertyType);
        switch (typeCode)
        {
            case TypeCode.Boolean:
                //doStuff
                break;
            case TypeCode.String:
                //doOtherStuff
                break;
            default: break;
        }

您可以对 TypeCode.Object 使用混合方法,如果使用 typeof,您可以在其中动态。这非常快,因为对于第一部分 - 开关 - 编译器可以根据查找表来决定。

于 2008-09-18T10:54:29.400 回答
3

你不能。您可以做的是使用字典创建类型和委托之间的映射:

var TypeMapping = new Dictionary<Type, Action<string>>(){
    {typeof(string), (x)=>Console.WriteLine("string")},
    {typeof(bool), (x)=>Console.WriteLine("bool")}
};



string s = "my string";

TypeMapping[s.GetType()]("foo");
TypeMapping[true.GetType()]("true");
于 2008-09-18T10:57:33.573 回答
2

我认为您在这里寻找的是一张好的地图。使用委托和通用 IDictionary 你可以做你想做的事。

尝试这样的事情:

private delegate object MyDelegate();

private IDictionary<Type, MyDelegate> functionMap = new IDictionary<Type, MyDelegate>();

public Init()
{
  functionMap.Add(typeof(String), someFunction);
  functionMap.Add(tyepof(Boolean), someOtherFunction);
}

public T doStuff<T>(Type someType)
{
   return (T)functionMap[someType]();
}
于 2008-09-18T10:58:22.683 回答
2

C# 7.0 将支持切换类型作为更大模式匹配功能的一部分。此示例取自宣布新功能的.NET 博客文章:

switch(shape)
{
    case Circle c:
        WriteLine($"circle with radius {c.Radius}");
        break;
    case Rectangle s when (s.Length == s.Height):
        WriteLine($"{s.Length} x {s.Height} square");
        break;
    case Rectangle r:
        WriteLine($"{r.Length} x {r.Height} rectangle");
        break;
    default:
        WriteLine("<unknown shape>");
        break;
    case null:
        throw new ArgumentNullException(nameof(shape));
}
于 2016-12-11T18:19:22.113 回答
0

不要担心在 switch 中使用字符串,因为如果你有多个,编译器会自动将其转换为哈希查找,尽管它看起来非常棒,但它提供了不错的性能。

类型字符串更改的问题可以通过自己进行显式哈希查找并在静态构造函数中填充哈希的内容来解决。这样,哈希在运行时会填充正确的字符串,因此它们保持正确。

于 2008-09-18T10:53:21.853 回答
0

你不能用 c# 中的 switch 来做到这一点,因为情况必须是不变的。

出什么问题了:

if(property.PropertyType == typeof(bool)) {
    //dostuff;
}
else if (property.PropertyType == typeof(string)) {
    //do other stuff;
}
于 2008-09-18T10:53:31.820 回答
0

我最近不得不做类似的事情,并且不能选择使用 switch。在 typeof(x) 上做一个 == 很好,但更优雅的方法可能是做这样的事情:

if(property.PropertyType is bool){
  //dostuff;
}
else if (property.PropertyType is string){
    //do other stuff;
}

但是,我不确定您是否可以以这种方式使用“is”关键字,我认为它仅适用于对象......

于 2008-09-18T10:58:16.583 回答
0

关于字符串匹配:问题中的要求之一是不通过字符串匹配来做到这一点。

字典是我将整个序列化算法放在它自己的库中时使用的一种方法。至于现在,我将首先尝试 typeCode,因为我的案例仅使用基本类型。如果这不起作用,我将回到 if/elses 群:S

在 ppl 问我为什么我想要自己的序列化之前:1).net xml 序列化不会在没有设置器的情况下序列化属性 2)序列化必须遵守一些遗留规则

于 2008-09-18T11:35:33.513 回答
-1

只需使用正常的 if/else if/else 模式:

if (property.PropertyType == typeof(Boolean))
{
} 
else if (property.PropertyType == typeof(String))
{
}
else if (...)
{
}
于 2008-09-18T10:54:08.450 回答
-1

我个人Dictionary<Type, other>最喜欢这种方法......我什至可以为您提供另一个示例:http ://www.timvw.be/presenting-namevaluecollectionhelper/

如果您坚持编写 switch-case 语句,您可以使用类型名称...

switch (blah.PropertyType.FullName)
{
   case typeof(int).FullName: break;
   case typeof(string).FullName: break;
}
于 2008-09-18T11:18:37.470 回答