检查类型的最快方法是什么?

bra*_*don 7 c# reflection performance types

我决定在一个函数中检查类型,而不是将函数重载100次或为不同类型创建100个不同的比较器.

例如,我使用默认比较器来比较2个对象中的一组类型(基元和字符串)的值.它包含以下代码:

public class DefComparer : IComparer<object> {
    public int Compare(object a, object b) {
        .... // a = a.GetType().GetField(field).GetValue(a); - not important for the question but I'm just showing that a&b below are different references
        switch (a.GetType().Name) {
            case "Byte":
                if ((byte)a == (byte)b) return 0;
                else if ((byte)a > (byte)b) return 1;
                else return -1;
            case "UInt16":
                if ((ushort)a == (ushort)b) return 0;
                else if ((ushort)a > (ushort)b) return 1;
                else return -1;
            case "SByte":
                if ((sbyte)a == (sbyte)b) return 0;
                else if ((sbyte)a > (sbyte)b) return 1;
                else return -1;
            case "Int16":
                ...
Run Code Online (Sandbox Code Playgroud)

在这里,我使用的switch语句比一系列if/ else语句更快.但是a.GetType().Name返回一个动态获得的字符串,这个方法涉及字符串比较.这对我来说听起来不是特别快.我需要Comparer在技术上尽可能快,因为它将用于大量数据集合.

问:有没有更快的方法来检查对象的类型(不涉及字符串比较)?什么是最快的方式?

Sri*_*vel 7

好吧,你手里拿着它.使用TypeCode

        int a = 10;
        Type t = a.GetType();

        switch (Type.GetTypeCode(t))
        {
            case TypeCode.Boolean:
                break;
            case TypeCode.Byte:
                break;
            case TypeCode.Char:
                break;
            case TypeCode.DBNull:
                break;
            case TypeCode.DateTime:
                break;
            case TypeCode.Decimal:
                break;
            case TypeCode.Double:
                break;
            case TypeCode.Empty:
                break;
            case TypeCode.Int16:
                break;
            case TypeCode.Int32:
                break;
            case TypeCode.Int64:
                break;
            case TypeCode.Object:
                break;
            case TypeCode.SByte:
                break;
            case TypeCode.Single:
                break;
            case TypeCode.String:
                break;
            case TypeCode.UInt16:
                break;
            case TypeCode.UInt32:
                break;
            case TypeCode.UInt64:
                break;
            default:
                break;
        }
Run Code Online (Sandbox Code Playgroud)

这支持所有原语.对于Custom对象else if在里面写语句TypeCode.Object.

我希望这有帮助.