首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定类型是否为静态类型

确定类型是否为静态类型
EN

Stack Overflow用户
提问于 2009-07-24 05:44:35
回答 5查看 12.9K关注 0票数 37

假设我有一个名为typeType

我想确定是否可以对我的类型执行此操作(而无需对每个类型执行此操作):

如果typeSystem.Windows.Point,那么我可以这样做:

代码语言:javascript
复制
Point point1 = new Point();

但是,如果typeSystem.Environment,则不会执行以下操作:

代码语言:javascript
复制
Environment environment1 = new Environment(); //wrong

那么,如果我遍历程序集中的每个可见类型,如何跳过所有无法创建类似第二个实例的类型呢?我对反射还是个新手,所以我对术语还不是很熟悉。希望我在这里要做的事情已经很清楚了。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-07-24 05:50:33

static类在IL级别被声明为abstractsealed。因此,您可以检查IsAbstract属性以一次性处理abstract类和static类(针对您的用例)。

但是,abstract类并不是唯一不能直接实例化的类型。您应该检查接口(without the CoClass attribute)和类型等不具有调用代码可访问的构造函数的内容。

票数 85
EN

Stack Overflow用户

发布于 2009-07-24 06:05:56

代码语言:javascript
复制
type.IsAbstract && type.IsSealed

因为在C#中抽象类不能是密封的或静态的,所以这对C#来说已经足够了。但是,在处理来自其他语言的CLR类型时需要小心。

票数 23
EN

Stack Overflow用户

发布于 2009-07-24 05:56:57

你可以搜索像这样的公共建筑商,

代码语言:javascript
复制
Type t = typeof(Environment);
var c = t.GetConstructors(BindingFlags.Public);
if (!t.IsAbstract && c.Length > 0)
{
     //You can create instance
}

或者,如果您只对无参数构造函数感兴趣,可以使用

代码语言:javascript
复制
Type t = typeof(Environment);
var c = t.GetConstructor(Type.EmptyTypes);
if (c != null && c.IsPublic && !t.IsAbstract )
{
     //You can create instance
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1175888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档