如何确定属性是否是用户定义的类型?我尝试使用IsClass,如下所示,但它的值对于String属性是真的(谁知道还有什么)。
foreach (var property in type.GetProperties()) {
if (property.PropertyType.IsClass) {
// do something with property
}
}
*已更新以获得更清晰*
我试图遍历给定类型的定义,如果在程序集中定义了给定类型或其任何公共属性,我正在搜索嵌入式JavaScript文档。我只是不想在本机.NET类型上浪费处理资源和时间。
答案 0 :(得分:10)
" ...与其他一些语言不同,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
}
}
如果可以在各种程序集中定义类型,则在大多数情况下系统命名空间除外:
foreach (var property in type.GetProperties()) {
if (property.PropertyType.IsClass
&& !property.PropertyType.FullName.StartsWith("System.")) {
// do something with property
}
}
答案 1 :(得分:9)
如果通过"用户定义"你的意思是它不是标准组件(mscorlib)的一部分,那么你可以按照以下方式做一些事情:
if(typeof(SomeType).Assembly.GetName().Name != "mscorlib") {
// user-defined!
}
然而,这也将考虑来自外部程序集(aka:libraries)的类型,以及#34;用户定义的#34;。如果您只需要当前程序集中的那些,那么您可以使用
typeof(SomeType).Assembly == Assembly.GetExecutingAssembly()
答案 2 :(得分:1)
我为单元测试编写了一个通用的populator,它为我的对象分配了可预测的值,并遇到了这种问题。在我的情况下,我想知道我的哪些属性是对象,以便我可以递归地填充这些对象属性,同样具有可预测的值。
在我看来,引入一个仅由我感兴趣的类遍历实现的接口是最好的方法。然后,您可以测试您的财产是否是您感兴趣的对象:
public static bool IsMyInterface(this Type propertyType)
{
return propertyType.GetInterface("MyInterfaceName") != null;
}
答案 3 :(得分:0)
如果通过"用户定义"你是指在执行程序集中声明的类型,然后你可以获得这些类型的列表,就像在这个示例c#console应用程序中一样:
class Program
{
static void Main( string[] args )
{
var currentAssembly = Assembly.GetExecutingAssembly();
var localTypes = currentAssembly.GetTypes();
}
}
<强>更新强>
如果要从所有引用的程序集中获取类型列表:
class Program
{
static void Main( string[] args )
{
var currentAssembly = Assembly.GetExecutingAssembly();
var referencedAssemblies = currentAssembly.GetReferencedAssemblies();
var typesFromReferencedAssemblies = referencedAssemblies.Select( assemblyName => Assembly.ReflectionOnlyLoad( assemblyName.FullName ) ).SelectMany( assembly => assembly.GetTypes() );
}
}
请注意,Program
类型也会出现在该列表中。这是否足以解决您的问题?
答案 4 :(得分:0)
说您的项目名为“ Foobar”,您所做的一切都在该命名空间下。您可以通过以下方法测试是否已编写它:
typeof(SomeType).Namespace.Contains("Foobar");