将具体对象类型作为通用方法的参数传递 [英] Pass concrete object type as parameter for generic method

查看:413
本文介绍了将具体对象类型作为通用方法的参数传递的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个API,使用泛型方法如下

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

我的应用程序包含在运行时使用CodeDOM生成的类,为了跟踪我创建了一个名为 IDataObject 的接口。我试图将每个对象的具体类型传递给上面的泛型方法,如下所示:

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 包含继承自 IDataObject 的类的实例。我有兴趣获得该类型并将其作为 T 传递。我试图找出是否有可能在这里使用动态 typeof() GetType()无法正常工作,如 Here

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

推荐答案

我怀疑你想要这样:

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

使用 dataObject 动态地获取执行时编译器来执行类型推断来解决 T

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

只需使用反射即可自行执行此操作,使用 MethodInfo.MakeGenericMethod - 但这种方式肯定会减少代码。

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

这篇关于将具体对象类型作为通用方法的参数传递的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆