比方说,我有一个Type
叫type
。
我想确定我是否能做到这一点与我喜欢的类型(没有实际这样对每种类型):
如果type
是System.Windows.Point
话,我可以这样做:
Point point1 = new Point();
然而,如果type
是System.Environment
,那么这将不会飞:
Environment environment1 = new Environment(); //wrong
所以,如果我通过每一个可见的类型在装配迭代我怎么跳过所有将无法创建像第二个实例的类型? 我有点新的反射,所以我不是伟大的术语呢。 希望什么,我想在这里做的是相当清楚的。
static
类声明abstract
和sealed
在IL级。 所以,你可以检查IsAbstract
属性来处理这两个abstract
类和static
类一气呵成(您的使用情况)。
但是, abstract
类是不是你不能直接实例唯一的类型。 您应该检查接口等东西( 没有CoClass
属性 )和类型没有通过调用代码访问的构造函数。
type.IsAbstract && type.IsSealed
这将是C#足够的检查,因为抽象类不能被密封或C#静态的。 但是,你需要与其他语言的CLR类型打交道时要小心。
您可以搜索公共contructors这样,
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
}
Type t = typeof(System.GC);
Console.WriteLine(t.Attributes);
TypeAttributes attribForStaticClass = TypeAttributes.AutoLayout | TypeAttributes.AnsiClass | TypeAttributes.Class |
TypeAttributes.Public | TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.BeforeFieldInit;
Console.WriteLine((t.Attributes == attribForStaticClass));
我想,这应该工作。
这是一种方式来获得所有类型的所有公共contstuctors在组件中。
var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes
var types = assembly.GetTypes();
foreach (var type in types)
{
var constructors = type.GetConstructors();
}