如何确定.NET Type是否是自定义结构?

时间:2010-04-26 13:43:54

标签: c# .net reflection struct types

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:8)

框架中定义的结构与您自己定义的结构之间没有区别。

有几个想法可能是:

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

<将上述评论放入扩展方法:

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

应该有效

答案 3 :(得分:2)

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

答案 4 :(得分:-1)

你有这种类型的价值吗?调用ToString方法并检查返回的字符串是否以“{”开头。

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