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

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

问题描述

我有一个使用通用方法的 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 传递.我试图找出是否可以在这里以某种方式使用 dynamic.typeof()GetType() 不像 这里

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

推荐答案

我怀疑你想要这样的东西:

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

动态使用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天全站免登陆