假设我有一个名为Type
的{{1}}。
我想确定我是否可以使用我的类型执行此操作(实际上不对每种类型执行此操作):
如果type
为type
,那么我可以这样做:
System.Windows.Point
但是如果Point point1 = new Point();
为type
,那么这将不会飞:
System.Environment
因此,如果我遍历程序集中的每个可见类型,如何跳过所有无法创建实例的类型,如第二个?我对反思很陌生,所以我的术语还不是很好。希望我在这里要做的很清楚。
答案 0 :(得分:64)
static
类在IL级别声明为abstract
和sealed
。因此,您可以检查IsAbstract
属性,一次性处理abstract
类和static
类(针对您的用例)。
但是,abstract
类不是您无法直接实例化的唯一类型。您应该检查接口(without the CoClass
attribute)和没有调用代码可访问的构造函数的类型。
答案 1 :(得分:12)
type.IsAbstract && type.IsSealed
这对C#来说是一个充分的检查,因为抽象类不能在C#中被密封或静态。但是,在处理来自其他语言的CLR类型时,您需要小心。
答案 2 :(得分:6)
你可以搜索像这样的公共构造函数,
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
}
答案 3 :(得分:1)
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));
我想,这应该可行。
答案 4 :(得分:-3)
这是一种在程序集中获取所有类型的所有公共contstuctor的方法。
var assembly = AppDomain.CurrentDomain.GetAssemblies()[0]; // first assembly for demo purposes
var types = assembly.GetTypes();
foreach (var type in types)
{
var constructors = type.GetConstructors();
}