代码之家  ›  专栏  ›  技术社区  ›  SztupY

如何确定.NET类型是否为自定义结构?[复制品]

  •  6
  • SztupY  · 技术社区  · 15 年前

    这个问题已经有了答案:

    如何编写一个简单的方法,该方法检查具体类型是否是自定义结构(使用 public struct { }; )或不是。

    检查 Type.IsValueType 是不够的,因为它也是真实的 int , long 等 并将支票添加到 !IsPrimitiveType 不会排除 decimal , DateTime 或许还有其他一些价值类型。我知道大多数内置值类型实际上是“structs”,但我只想检查“custom structs”

    这些问题基本上是相同的,但没有答案,我需要:

    编辑:从提到的答案来看,“检查‘系统’前缀”是最稳定的(尽管它仍然是一个黑客)。我最终决定创建一个属性,您必须用它来装饰结构,以便框架将其作为一个自定义结构。(另一个选择是创建一个空接口,让struct实现那个空接口,但是属性方式看起来更优雅)

    如果有人感兴趣,这是我原来的自定义结构检查器:

    type.IsValueType && !type.IsPrimitive && !type.Namespace.StartsWith("System") && !type.IsEnum
    
    5 回复  |  直到 14 年前
        1
  •  5
  •   Matt Greer    15 年前

    好吧,日期时间、小数等符合你的要求。就CLR而言,它们是自定义结构。不过,你可以检查一下名称空间是否以“system”开头。

        2
  •  8
  •   stusmith    15 年前

    在框架中定义的结构和您自己定义的结构没有区别。

    有几个想法可以是:

    • 保留框架结构的白名单,并排除它们;
    • 标识在中定义类型的程序集(dll),并保留框架程序集的白名单。
    • 标识类型所在的命名空间,并排除框架命名空间。
        3
  •  3
  •   GreyCloud    14 年前

    将上述意见纳入扩展方法:

    public static class ReflectionExtensions {
            public static bool IsCustomValueType(this Type type) {            
                   return type.IsValueType && !type.IsPrimitive && type.Namespace != null && !type.Namespace.StartsWith("System.");
            }
        }
    

    应该工作

        4
  •  2
  •   this. __curious_geek    15 年前

    您可以检查结构类型是否属于 系统名字空间 . 但这又不是一个可靠的解决方案。

        5
  •  -1
  •   Eddy Vluggen    14 年前

    你有那种类型的值吗?打电话给 ToString 方法并检查返回的字符串是否以“{”开头。

    如果没有值,请检查它是否有无参数构造函数。如果没有,它就是一个构造器。如果是,使用 Activator 创建实例并调用 弦线 方法。