当前位置: 首页 > 知识库问答 >
问题:

如何将PropertyInfo.PropertyType作为数据类型传递给实例化变量并将其传递给泛型函数?

从经略
2023-03-14

我正在尝试用Dapper和存储过程编写一些更通用的代码。我做了一些研究,但我被这部分卡住了…

我有一些类似实体的类,这些实体将被一些存储过程返回(那些过程不能被修改)。例如,我有两个类。

public class User 
{
     public int Id { get; set; }
     public string Username { get; set; }
     public string Email { get; set; }
}

public class Role 
{
     public int Id { get; set; }
     public string Name { get; set; }
     public string Description { get; set; }
}

存储过程通常返回一些select子句,对于本例,它返回两个select子句,每个子句用于用户和角色的信息,因此我有以下类来存储这些子句。

public class UserAndRoleInfo 
{
     public IEnumerable<User> users { get; set; }
     public IEnumerable<Role> roles { get; set;}
}

在这个项目中,我们必须使用Dapper,所以我做了一个泛型函数,其中T是将返回的类,这个类具有与上面显示的相同的结构,并且可以有两个或更多的实体作为属性。

其主要思想是获取T的属性,然后为每个属性获取由铸造为property type的select子句返回的值,最后将该属性添加到将要返回的类实例中。

public async Task<T> ExecuteStoreProcedureMultiQuery<T>(string cnx, string storeProcedure, object param = null) where T : class, new()
    {

        using (var conn = new SqlConnection(cnx))
        {
            conn.Open();
            var result = param == null
                ? await conn.QueryMultipleAsync(
                    storeProcedure,
                    commandType: CommandType.StoredProcedure
                    
                ).ConfigureAwait(false)
                : await conn.QueryMultipleAsync(
                    storeProcedure,
                    param: param,
                    commandType: CommandType.StoredProcedure
                    
                ).ConfigureAwait(false);

            T res = new T();
            Type t = typeof(T);

            PropertyInfo[] propInfos = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach(PropertyInfo propInfo in propInfos){
                // I want to do something like this 
                propInfo.PropertyType propValue = result.Read<propInfo.PropertyType.GetEnumUnderlyingType()>();
                propInfo.SetValue(res, propValue);
            }
            

            conn.Close();
            conn.Dispose();

            
            return res;
        }
    }

这里的问题是,我不确定如何获得这个PropInfo.PropertyTypePropValue=Result.Read (); ,我正在使用Activator.CreateInstance(propInfo.PropertyType),但我不确定在这种情况下如何实现它。

如果有些东西不清楚或者需要更多的信息,我在这里回答。提前道谢。

共有1个答案

洪飞白
2023-03-14

使用这里的答案作为参考,您可以这样做:

foreach (var propInfo in propInfos)
{
    var method = result.GetType().GetMethod(nameof(result.Read));
    var generic = method.MakeGenericMethod(propInfo.PropertyType.GetEnumUnderlyingType());
    var propValue = generic.Invoke(result, null);
    propInfo.SetValue(res, propValue);
}
 类似资料:
  • 问题内容: 这是我的基本功能: 此功能能够连接并在我的数据库上执行查询… 我想创建相同的功能,但更通用。…前一个仅用于一个表(),新表必须能够接受查询的参数作为输入,以及将在其中执行查询的类类型。这将允许我仅使用一行来执行查询。 应该是这样的: 您发现我不知道如何“通用”代码… 我希望已经清楚了… PS 应该是DB()中表的类的代表。 谢谢。 问题答案: 如果您打算返回结果集,请使用:

  • 我正在尝试按房间类别(手术室或技术室)返回过滤后的

  • 问题内容: 我想知道如何在Quartz中从外部传递实例变量? 下面是我想写的伪代码。如何将externalInstance传递给此Job? 问题答案: 您可以将您的实例放在schedulerContext中。要计划作业时,可以在执行以下操作之前: 您的工作类别如下: 如果您使用的是Spring,那么您实际上可以使用spring的支持来注入整个applicationContext,就像在Link中回

  • 我有一个抽象基类,它有以下私有变量 我希望其他所有扩展基类的类都实现以下方法 我的问题是,除了Map之外,我不能为实现选择任何其他类型 如果我不能控制选项映射的类型,但我想让initOptions方法的实现类知道映射中的键是String类型,值可以是任何对象,那么处理这种情况的正确方法是什么。

  • 问题内容: 我需要更新我的时间。该值由正在执行的函数返回。 返回一个整数。 这将返回未防御状态。因此,我需要获取计数并将其传递给 问题答案: 如果您需要在每次调用之后更改重复间隔,则不能使用-使用恒定重复。您需要使用,因此您可以每次更改时间段:

  • 问题内容: 将变量数据从传递到类的最佳方法是什么?数据是在第一个类中创建的,我需要将该数据传递给第二个类而不使用Intent。任何代码示例将不胜感激。 自从我开始工作以来,我就打算将其发布。就我而言,我已经有一个,而我正在做的事情我需要另一个相同的类型。因此,这里去: 班级活动 我的主要活动 请注意,我必须先创建主类的实例 问题答案: 如果您的班级名称是为此创建的,并将值作为参数传递,则下面是一个