如何检查无参数构造函数的类型

本文关键字:参数 构造函数 类型 何检查 检查 | 更新日期: 2023-09-27 18:32:14

因为我想避免异常,所以我想检查类型是否具有无参数构造函数。我怎样才能做到这一点?

我需要这样的东西:

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 并且创建实例抛出异常

无参数构造函数

溶液:

bool HasDefaultConstructor(Type t)
{
   return t.GetConstructor(Type.EmptyTypes) != null;
}

涉及许多递归函数和迭代,在这种方式的某个地方,错误的泛型函数 HasDefaultConstructor(带有类型对象)被调用。使用非泛型函数就可以解决问题。

感谢大家的建设性帮助。

如何检查无参数构造函数的类型

GetConstructor(Type.EmptyTypes)将返回无参数构造函数,如果不存在,则返回 null,因此您可以拥有:

return typeof(TT).GetConstructor(Type.EmptyTypes) != null;

编辑

我猜你的问题是TTsource.GetType()实际上是两种不同的类型。 source.GetType()可能派生自TT但没有无参数构造函数。因此,您实际需要做的就是检查source.GetType()

bool HasDefaultConstructor(Type t)
{
   return t.GetConstructor(Type.EmptyTypes) != null;
}
if(!HasDefaultConstructor(source.GetType()))
    ...

使用反射检查类型是否具有无参数构造函数。使用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
                         )