Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass concrete object type as parameter for generic method

I have an API using generic method as follow

public static class DataProvider
{
    public static Boolean DeleteDataObject<T>(Guid uid, IDbConnection dbConnection)
    {
        // Do something here
    }

    public static IDbConnection GetConnection()
    {
        // Get connection
    }
}

My application contains classes generated using CodeDOM at runtime, and in order to keep track of I created an interface called IDataObject. I am trying to pass the concrete type of each object to the generic method above as follow:

public static Boolean PurgeDataObject(this IDataObject dataObject, Guid uid)
{
    return DataProvider.DeleteDataObject<T>(uid, DataProvider.GetConnection());
}

dataObject contains an instance of a class that inherit from IDataObject. I am interested in getting that type and pass it as T. I am trying to find out if it is possible to somehow use dynamic here. typeof() and GetType() does not work as stated in Here

like image 949
Moslem Ben Dhaou Avatar asked May 10 '13 22:05

Moslem Ben Dhaou


1 Answers

I suspect you want something like this:

public static Boolean PurgeDataObject(this IDataObject dataObject, Guid uid)
{
    return PurgeDataObjectImpl((dynamic) dataObject, uid);
}

private static Boolean PurgeDataObjectImpl<T>(T dataObject, Guid uid)
    where T : IDataObject
{
    return DataProvider.DeleteDataObject<T>(uid, DataProvider.GetConnection());
}

That uses dataObject dynamically, getting the "execution-time compiler" to perform type inference to work out T.

You could just use reflection to do this yourself, using MethodInfo.MakeGenericMethod - but this way is certainly less code.

like image 178
Jon Skeet Avatar answered Nov 15 '22 19:11

Jon Skeet