【问题标题】:Pass concrete object type as parameter for generic method将具体对象类型作为泛型方法的参数传递
【发布时间】:2013-05-05 16:34:20
【问题描述】:

我有一个使用如下通用方法的 API

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

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

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

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

dataObject 包含一个继承自 IDataObject 的类的实例。我有兴趣获取该类型并将其作为T 传递。我试图找出是否有可能在这里使用dynamictypeof()GetType() 不能按照 Here 中的说明工作

【问题讨论】:

  • 有一些技巧可以使用动态作为反射和泛型之间的桥梁,但它们需要一个实例。如果您没有实例,MakeGenericMethod 是您的主要工具。或非通用 API...
  • @MarcGravell:dataObject 是一个实例,其中包含我试图提取和传递的类型信息。看看乔恩的答案

标签: c# .net generics dynamic types


【解决方案1】:

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

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

可以自己使用反射来做这件事,使用MethodInfo.MakeGenericMethod - 但这种方式肯定是更少的代码。

【讨论】:

  • 这正是我正在寻找的谢谢!
  • 第一个方法中的调用应该是return PurgeDataObjectImpl((dynamic) dataObject, uid);(方法名错误,少于6个字符,我不能编辑)
  • +1 - 这个动态演员阵容非常适合过去一个小时让我困惑的小角落案例。我只是希望我不要 over-use 它,而是要考虑选项 - 非常简单,也很重要。谢谢
猜你喜欢
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 2019-02-27
  • 2019-03-05
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多