当new-able时使用new T(),否则使用default(T)

本文关键字:default new-able new | 更新日期: 2023-09-27 18:17:07

我正在研究一个c#泛型函数。当出现错误时,如果泛型类型可以是new-able,则返回new T(),否则返回default(T)

代码如下:

private T Func<T>()
{
    try
    {
        // try to do something...
    }
    catch (Exception exception)
    {
        if (T is new-able) // <---------- How to do this?
        {
            return new T();
        }
        else
        {
            return default(T);
        }
    }
}

我知道使用new T()的需要where T : new()。问题是,如何在运行时判断?

当new-able时使用new T(),否则使用default(T)

您只需要检查该类型是否具有无参数构造函数。您可以调用Type.GetConstructor方法,并将空类型作为参数。

var constructorInfo = typeof(T).GetConstructor(Type.EmptyTypes);
if(constructorInfo != null)
{
   //here you go
   object instance = constructorInfo.Invoke(null);
}

如果我没记错的话,如果T是一个类,Activator.CreateInstance<T>将返回一个用无参数构造函数构造的对象,如果T是一个结构体,则返回一个default(T)

您可以在Sriram的回答中使用该技术,首先确保T存在无参数构造函数。

您可以检查默认构造函数并在找到时执行new T()。要做到这一点,您可以使用如下命令:

var constructor = typeof(T).GetConstructor(Type.EmptyTypes);
if(constructor != null)
{
    return (T)constructor.Invoke(null);
}
else
{
    return default(T);
}

我稍微玩弄了一下MarcoLaser的回答,使我的'如果T是可更新的,那么获取实例构造函数'

public class MyClass<T>
{
        public MyClass()
        {
            var constructor = typeof(T).GetConstructor(Type.EmptyTypes);
            if (constructor != null)
                Data = (T)constructor.Invoke(null);  
        }
        public T Data { get; set; }
}