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

时间:2014-08-08 06:48:16

标签: c# generics types default

我正在研究C#泛型函数。出现错误时,如果泛型类型可以是新的,请返回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);
        }
    }
}

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

4 个答案:

答案 0 :(得分:20)

您只需要检查该类型是否具有无参数构造函数。您可以通过使用空类型作为参数调用Type.GetConstructor方法来完成此操作。

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

您可能会检查默认构造函数并执行新的T()(如果找到)。 要做到这一点,你可以使用类似的东西:

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

答案 3 :(得分:1)

我很少玩弄enter image description here的回答,并让我的 '如果 T 是 newable 则获取实例构造函数'

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; }
}