因为我想避免异常,所以我想检查一个类型是否有无参数构造函数。我怎样才能做到这一点?
我需要这样的东西:
bool HasDefaultConstructor<TT>(TT source)
{
return ???;
}
编辑: 我想创建一个与源类型相同的对象,如果它没有默认构造函数,我想改用 default(TT)。
我现在拥有的是:
static TT CreateObject<TT>(TT source)
{
try
{
if(!HasDefaultConstructor<TT>(source))
{
return default(TT);
}
return (TT)Activator.CreateInstance(source.GetType());
}
catch(Exception ex)
{
Trace.WriteLine("Exception catched!\r\n" + ex);
}
return default(TT);
}
static bool HasDefaultConstructor<TT>(TT source)
{
ConstructorInfo c = typeof(TT).GetConstructor(new Type[] { });
return c != null;
}
但检查结果为真,CreateInstance 抛出异常
No parameterless constructor
解决方法:
bool HasDefaultConstructor(Type t)
{
return t.GetConstructor(Type.EmptyTypes) != null;
}
其中涉及许多递归函数和迭代,在这种情况下,调用了错误的通用函数 HasDefaultConstructor(具有对象类型)。使用非通用函数就可以了。
感谢大家的建设性帮助。
最佳答案
GetConstructor(Type.EmptyTypes)
将返回无参数构造函数,如果不存在则返回 null,因此您可以:
return typeof(TT).GetConstructor(Type.EmptyTypes) != null;
编辑
我猜你的问题是 TT
和 source.GetType()
实际上是两种不同的类型。 source.GetType()
可能派生自 TT
但没有无参数构造函数。所以您实际需要做的是检查 source.GetType()
:
bool HasDefaultConstructor(Type t)
{
return t.GetConstructor(Type.EmptyTypes) != null;
}
if(!HasDefaultConstructor(source.GetType()))
...
关于c# - 如何检查无参数构造函数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27144511/