如何测试类型是否可实例化?

时间:2018-11-01 19:34:28

标签: c# .net .net-core instantiation

我输入的是T,我想检查它是否可以安全地传递到Activator.CreateInstance(T)

我想到的是这样做:

if(!T.IsInterface && !T.IsAbstract)
{
    instance = (T)Activator.CreateInstance(T);
}

但是:

  • 够了吗?我没有错过必要的考试吗?类型是否可能不是接口,也不是抽象类,但是仍然无法实例化?鉴于我对C#的了解还很初级,我认为很可能错过了一两个极端的情况。
  • 我必须手动编写测试吗?是否没有类似T.IsInstantiable或该语言中包含的内容?

编辑:否,T不是来自一般约束。这是一段代码T来自:

var instances = System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
    .Where(
        // some other constraints
    ).Where(
        // can be instantiated, I'm trying to figure this part in my question
    ).Select(
        T => Activator.CreateInstance(T)
    );

1 个答案:

答案 0 :(得分:1)

如果T是通用参数,则只需在其上使用new()约束。这样,编译器将强制执行此操作,而不是运行时