c# - 如何检查无参数构造函数的类型?

标签 c# .net reflection constructor

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

我需要这样的东西:

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;

编辑

我猜你的问题是 TTsource.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/

相关文章:

c# - 如何以最快的方式检查网络连接?

Go:带有接口(interface)的结构的动态类型转换/断言(调用方法和使用结构公共(public))

c# - 在不创建新实例的情况下反射(reflect)嵌套实例

直到运行时才知道类型的 Java 类型转换

c# - 将 Func 委托(delegate)与 Async 方法结合使用

c# - 针对多个字段的 LINQ string[]

.net - 如何在 WinForms 应用程序中安排任务?

c# - .NET : How to validate XML file with DTD without DOCTYPE declaration

.net - 如何更改 RichTextBox 中某行的背景颜色?

c# - 透明后的橙色圆点