假设我有一个名为type的Type。
我想确定是否可以对我的类型执行此操作(而无需对每个类型执行此操作):
如果type为System.Windows.Point,那么我可以这样做:
Point point1 = new Point();但是,如果type为System.Environment,则不会执行以下操作:
Environment environment1 = new Environment(); //wrong那么,如果我遍历程序集中的每个可见类型,如何跳过所有无法创建类似第二个实例的类型呢?我对反射还是个新手,所以我对术语还不是很熟悉。希望我在这里要做的事情已经很清楚了。
发布于 2009-07-24 05:50:33
static类在IL级别被声明为abstract和sealed。因此,您可以检查IsAbstract属性以一次性处理abstract类和static类(针对您的用例)。
但是,abstract类并不是唯一不能直接实例化的类型。您应该检查接口(without the CoClass attribute)和类型等不具有调用代码可访问的构造函数的内容。
发布于 2009-07-24 06:05:56
type.IsAbstract && type.IsSealed因为在C#中抽象类不能是密封的或静态的,所以这对C#来说已经足够了。但是,在处理来自其他语言的CLR类型时需要小心。
发布于 2009-07-24 05:56:57
你可以搜索像这样的公共建筑商,
Type t = typeof(Environment);
var c = t.GetConstructors(BindingFlags.Public);
if (!t.IsAbstract && c.Length > 0)
{
//You can create instance
}或者,如果您只对无参数构造函数感兴趣,可以使用
Type t = typeof(Environment);
var c = t.GetConstructor(Type.EmptyTypes);
if (c != null && c.IsPublic && !t.IsAbstract )
{
//You can create instance
}https://stackoverflow.com/questions/1175888
复制相似问题