切换PropertyType

时间:2008-09-18 10:47:29

标签: c# switch-statement

我该如何做到这一点?

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

我不想使用这个名字,因为字符串比较类型很糟糕,可能会有变化。

10 个答案:

答案 0 :(得分:43)

        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进行动态处理。这非常快,因为对于第一部分 - 交换机 - 编译器可以根据查找表来决定。

答案 1 :(得分: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");

答案 2 :(得分: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]();
}

答案 3 :(得分:1)

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

如果您坚持编写switch-case语句,可以使用Type name ...

switch (blah.PropertyType.FullName)
{
   case typeof(int).FullName: break;
   case typeof(string).FullName: break;
}

答案 4 :(得分:1)

C#7.0将支持打开类型作为更大模式匹配功能的一部分。 此示例取自宣布新功能的.NET blog post

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));
}

答案 5 :(得分:0)

不要担心在交换机中使用字符串,因为如果你有几个,编译器会自动将其转换为哈希查找,尽管它看起来非常令人满意。

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

答案 6 :(得分:0)

你不能在c#中切换,因为必须保持不变。

有什么问题:

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

答案 7 :(得分:0)

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

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

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

答案 8 :(得分:0)

关于字符串匹配:问题中的一个要求就是不通过字符串匹配来实现。

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

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

答案 9 :(得分:-1)

只需使用普通的if / else if / else模式:

if (property.PropertyType == typeof(Boolean))
{
} 
else if (property.PropertyType == typeof(String))
{
}
else if (...)
{
}