【问题标题】:How to determine if a .NET Type is a custom struct? [duplicate]如何确定 .NET 类型是否为自定义结构? [复制]
【发布时间】:2011-02-12 10:08:18
【问题描述】:

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

检查Type.IsValueType是不够的,因为intlong等也是如此, 并向!IsPrimitiveType 添加检查不会排除decimalDateTime 以及可能的其他一些值类型。我知道大多数内置值类型实际上是“结构”,但我只想检查“自定义结构”

这些问题大多相同,但没有我需要的答案:

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

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

type.IsValueType && !type.IsPrimitive && !type.Namespace.StartsWith("System") && !type.IsEnum

【问题讨论】:

  • 只是出于好奇,你为什么要检测这个?
  • Fluent NHibernate + 自动映射:将所有自定义结构设置为组件(值对象)处理;将任何其他值类型设置为组件(如 DateTime 或小数)将使整个框架崩溃(至少在单声道下会崩溃)

标签: c# .net reflection struct types


【解决方案1】:

您有与该类型相符的价值吗?调用ToString方法,查看返回的字符串是否以“{”开头。

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

【讨论】:

    【解决方案2】:

    把上面的cmets放到一个extension方法里:

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

    应该工作

    【讨论】:

      【解决方案3】:

      您可以检查结构类型是否属于系统命名空间中的任何位置。但这又不是一个可靠的解决方案。

      【讨论】:

        【解决方案4】:

        框架中定义的struct和自己定义的struct没有区别。

        几个想法可能是:

        • 保留框架结构的白名单,并将其排除在外;
        • 识别定义类型的程序集 (DLL),并保留框架程序集的白名单。
        • 确定类型所在的命名空间,并排除框架的命名空间。

        【讨论】:

        • 在使用 Fluent NHibernate 的评论中,“知名”结构的白名单将是最好的方法。该列表足够短,易于理解,并且可能永远不会更改。
        • 同意,当您找到导致崩溃的每个问题时,将其添加到白名单(或黑名单或任何您称之为的名称)中,然后继续。该框架没有太多的结构。
        • 是的,但遗憾的是没有此列表。如果你错过了一些东西,然后再使用那个结构,你就不会知道为什么框架开始崩溃了
        【解决方案5】:

        嗯,DateTime、decimal 等符合您的要求。就 CLR 而言,它们是自定义结构。一个 hack,但您可以检查命名空间是否以“System”开头。

        【讨论】:

        • 当然你自己的命名空间可以以 System 开头... :) 没有人会那样做,对吧?
        • 是的,这就是我称其为 hack 的原因。
        • @MattGreer:顺便说一句,很棒的 hack,我想不到 :) 谢谢
        猜你喜欢
        • 2017-06-23
        • 2011-01-18
        • 2014-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 1970-01-01
        相关资源
        最近更新 更多