通过具体的对象类型作为参数的泛型方法对象、具体、参数、类型

2023-09-02 01:50:45 作者:籹人,伱夲該驕傲旳萿著

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

 公共静态类的DataProvider
{
    公共静态布尔DeleteDataObject< T>(GUID UID,的IDbConnection的DbConnection)
    {
        //做的东西在这里
    }

    公共静态的IDbConnection的getConnection()
    {
        //获取连接
    }
}
 

我的应用程序中包含使用codeDOM在运行时生成的类,并且为了保持跟踪我创建了一个名为接口的IDataObject 。我想具体类型的每个对象传递给泛型方法上面如下:

 公共静态布尔PurgeDataObject(这IDataObject的数据对象,UID的Guid)
{
    返回DataProvider.DeleteDataObject< T>(UID,DataProvider.GetConnection());
}
 

数据对象包含由的IDataObject 继承一个类的实例。我感兴趣的是得到该类型,并将其作为 T 。我试图找出是否有可能以某种方式使用动态在这里。 typeof运算()的GetType()并不在Here

解决方案

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

 公共静态布尔PurgeDataObject(这IDataObject的数据对象,UID的Guid)
{
    返回PurgeDataObjectImpl((动态)数据对象,UID);
}

私有静态布尔PurgeDataObjectImpl< T>(T数据对象,UID的Guid)
    其中T:IDataObject的
{
    返回DataProvider.DeleteDataObject< T>(UID,DataProvider.GetConnection());
}
 
Java中泛型的使用

使用数据对象动态,让执行即时编译器来执行类型推断制定 T

您的可以的只是使用反射来自己做,用 MethodInfo.MakeGenericMethod - 但这种方式肯定是少code

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

解决方案

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.

 
精彩推荐
图片推荐