如何确定属性是否是C#中的用户定义类型?

Bil*_*man 12 c# reflection

如何确定属性是否是用户定义的类型?我尝试使用IsClass,如下所示,但它的值对于String属性是真的(谁知道还有什么).

foreach (var property in type.GetProperties()) {
    if (property.PropertyType.IsClass) {
        // do something with property
    }
}
Run Code Online (Sandbox Code Playgroud)

*更新以获得更清晰*

我试图遍历给定类型的定义,如果在程序集中定义了给定类型或其任何公共属性,我正在搜索嵌入式JavaScript文档.我只是不想在本机.NET类型上浪费处理资源和时间.

Bil*_*man 12

@Bobson提出了一个非常好的观点:

"......与其他一些语言不同,C#在"用户定义"和"标准"类型之间没有任何实际区别."

从技术上讲,@ Bobson给出了答案; 用户定义的类型与.NET Framework中定义的类型或任何其他程序集之间没有区别.

但是,我找到了几种有用的方法来确定类型是否是用户定义的.

要搜索给定类型程序集中定义的所有类型,这非常有用:

foreach (var property in type.GetProperties()) {
    if (property.PropertyType.IsClass 
    && property.PropertyType.Assembly.FullName == type.Assembly.FullName) {
        // do something with property
    }
}
Run Code Online (Sandbox Code Playgroud)

如果可以在各种程序集中定义类型,则在大多数情况下不包括System名称空间:

foreach (var property in type.GetProperties()) {
    if (property.PropertyType.IsClass 
    && !property.PropertyType.FullName.StartsWith("System.")) {
        // do something with property
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我还要加上“微软”。要排除列表的命名空间 (2认同)

Jer*_*vel 9

如果通过"用户定义"表示它不是标准程序集(mscorlib)的一部分,那么您可以按照以下方式执行某些操作:

if(typeof(SomeType).Assembly.GetName().Name != "mscorlib") {
    // user-defined!
}
Run Code Online (Sandbox Code Playgroud)

但是,这也将考虑外部程序集(aka:libraries)中的类型被视为"用户定义".如果您只想要当前组件中的那些,那么您可以使用

typeof(SomeType).Assembly == Assembly.GetExecutingAssembly()
Run Code Online (Sandbox Code Playgroud)