Bea*_*ker 29 .net c# reflection types instantiation
假设我有一个Type电话type.
我想确定我是否可以使用我的类型执行此操作(实际上不对每种类型执行此操作):
如果type是,System.Windows.Point那么我可以这样做:
Point point1 = new Point();
Run Code Online (Sandbox Code Playgroud)
但是,如果type是,System.Environment那么这将不会飞:
Environment environment1 = new Environment(); //wrong
Run Code Online (Sandbox Code Playgroud)
因此,如果我遍历程序集中的每个可见类型,如何跳过将无法创建第二个实例的所有类型?我对反思很陌生,所以我的术语还不是很好.希望我在这里尝试做的很清楚.
Meh*_*ari 69
static类被声明abstract并且sealed在IL级别.因此,您可以检查IsAbstract属性以一次性处理abstract类和static类(对于您的用例).
但是,abstract类不是您无法直接实例化的唯一类型.您应该检查接口(没有CoClass属性)和没有调用代码可访问的构造函数的类型.
Joe*_*ung 15
type.IsAbstract && type.IsSealed
Run Code Online (Sandbox Code Playgroud)
这对C#来说是一个充分的检查,因为抽象类不能在C#中被密封或静态.但是,在处理来自其他语言的CLR类型时,您需要小心.
你可以搜索这样的公共结构,
Type t = typeof(Environment);
var c = t.GetConstructors(BindingFlags.Public);
if (!t.IsAbstract && c.Length > 0)
{
//You can create instance
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您只对无参数构造函数感兴趣,则可以使用
Type t = typeof(Environment);
var c = t.GetConstructor(Type.EmptyTypes);
if (c != null && c.IsPublic && !t.IsAbstract )
{
//You can create instance
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9368 次 |
| 最近记录: |