切换PropertyType

时间:2020-03-06 14:20:45  来源:igfitidea点击:

我该如何进行这项工作?

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

我不想使用该名称,因为类型的字符串比较非常糟糕,可以更改。

解决方案

不用担心在开关中使用字符串,因为如果我们有多个字符串,编译器会自动将其转换为散列查找,尽管看起来很不错,但仍可提供不错的性能。

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

如果大小写必须恒定,则无法使用switch进行此操作。

出什么问题了:

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

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

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

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可以动态进行混合。这非常快,因为对于开关的第一部分,编译器可以根据查找表进行决定。

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

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

最近,我不得不做类似的事情,并且不能使用switch。在typeof(x)上执行==很好,但是更优雅的方法可能是执行以下操作:

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

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

我认为我们在这里寻找的是一张不错的地图。使用委托和通用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]();
}

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

如果我们坚持要编写一个switch-case语句,则可以使用Type名称...

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

关于字符串匹配:不通过字符串匹配来完成它是问题中的要求之一。

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

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