因为我想避免异常,所以我想检查一个类型是否有一个无参数构造函数。我怎样才能做到这一点?
我需要这样的东西:
bool HasDefaultConstructor<TT>(TT source)
{
return ???;
}
编辑: 我想创建一个与source相同类型的对象,如果它没有默认构造函数,我想使用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;
}
但是检查给了我true,CreateInstance抛出了异常
无参数构造函数
解决方案:
bool HasDefaultConstructor(Type t)
{
return t.GetConstructor(Type.EmptyTypes) != null;
}
涉及到许多递归函数和迭代,并且在某种程度上,已经调用了错误的泛型函数HasDefaultConstructor(带有类型对象)。使用非泛型函数就可以了。
谢谢大家的建设性帮助。
答案 0 :(得分:9)
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()))
...
答案 1 :(得分:8)
使用反射来检查类型是否具有无参数构造函数。使用Type.GetConstructor
:
bool HasDefaultConstructor<TT>()
{
ConstructorInfo c = typeof(TT).GetConstructor(new Type[] { });
// A constructor without any types defined: no parameters
return c != null;
}
如果您只想创建TT
的实例,请使用new
约束:
TT CreateUsingDefaultConstructor<TT>() where TT : new()
{
return new TT();
}
正如Jeppe Stig Nielsen建议的那样,您可以使用此代码来查找非public
的构造函数。在我看来,你应该只把它作为最后的手段!
typeof(TT).GetConstructor( BindingFlags.Instance
| BindingFlags.NonPublic
| BindingFlags.Public
, null
, new Type[] { }
, null
)