当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()
。问题是,如何在运行时判断?
您只需要检查该类型是否具有无参数构造函数。您可以调用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; }
}