我正在研究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()
。这个问题是,如何在运行时判断这个?
答案 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)