Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check a type for parameterless constructor?

Because I want to avoid an exception, I want to check whether a type has a parameterless constructor. How can I achieve this?

I need something like this:

bool HasDefaultConstructor<TT>(TT source)
{
   return ???;
}

EDIT: I want to create an object of same type as source and if it hasn't a default constructor I want to use default(TT) instead.

What I have right now is:

        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;
    }

But the check gives me true and CreateInstance throws exception

No parameterless constructor

Solution:

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

There were many recursive functions and iterations involved and somewhere down this way, the wrong generic function HasDefaultConstructor (with type object) has been called. Using a non generic function did the trick.

Thank you all for your constructive help.

like image 536
MTR Avatar asked Nov 26 '14 08:11

MTR


1 Answers

GetConstructor(Type.EmptyTypes) will return the parameterless constructor, or null if one does not exist, so you can have:

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

EDIT

I'm guessing your problem is that TT and source.GetType() are actually two different types. source.GetType() probably derives from TT but has no parameterless constructor. So what you actually need to do is make the check for source.GetType():

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

if(!HasDefaultConstructor(source.GetType()))
    ...
like image 104
Adi Lester Avatar answered Sep 28 '22 04:09

Adi Lester