动态/在运行时更改方法数据类型

我有一个带有40个表的Sql DB,并且我建立了代表每个表的模型,我也使用Dapper作为我的ORM ...

我正在DAL(数据访问层)中构建CRUD语句,该语句将使用myModelObj(通过HTTPPost进入)和modelName(通过URL参数进入)

我还有一个方法(MyMapper)会将我的myModelObj映射到我的模型-但是我创建的方法的类型为object,它返回System.Object类型-我想发生的是该方法返回模型并动态/在运行时转换调用方法的数据类型,以匹配要返回的模型类型...

我的代码:

控制器

private readonly IDbOperation _dbo;
...
...

public DataController(IDbOperation dboperation)
{
      _dbo = dboperation;
}

...

[HttpPost("create/{modelName}",Name = "Generic CRUD: Create Method")]
[Produces("application/json")]
public actionResult Create([FromBody] JObject createObject,string modelName)
{
  try
  {
      ... ... ...

      object response = _dbo.CreateRecord(createObject,modelName);

// HTTP Post Body example
{
    "Fullname": "Juan Carlos","Firstname": "Juan","Lastname": "Carlos","Salutation": "Dr.","Age": 30,"CreatedOn": "2019-11-07T12:25:10"
}

DbOperation

private readonly IDbConnector _dbConnector
...

public DbOperation(IDbConnector dbConnector)
{
      _dbConnector = dbConnector;
}

public JsonResult CreateRecord(JObject model,string modelName)
{
      ... ... ...
      var create = MyMapper(modelName,model); // <<<
      ... ...
      try
      {
            using (var connection = _dbConnector.GetMsSqlConnection())
            {
                 // https://dapper-tutorial.net/insert
                 var createdId = connection.Insert(create); 
                 ...
            }
      }
}

private object MyMapper(string modelName,JObject mod)
{
      switch (modelName.ToLower())
      {
           case "transaction":
                return JsonConvert.DeserializeObject<ModelRepodTO.Transaction>(model.ToString());

           case "items":
                return JsonConvert.DeserializeObject<ModelRepodTO.Items>(model.ToString());

           case "users":
                return JsonConvert.DeserializeObject<ModelRepodTO.Users>(mod.ToString());
      ...
      ...
           default:
                _logger.Error("DataaccessLayer","DbOperation",">>> Mapping decision could not be made");
                break;
    }
}

DbConnector

public class DbConnector : IDbConnector
{
    private readonly string _connectionstring;

    public DbConnector(IConfiguration config)
    {
        _connectionstring = config.Getvalue<string>("Connectionstring");
    }

    public SqlConnection GetMsSqlConnection()
    {
        SqlConnection conn = null;
        try
        {
            conn = new SqlConnection(_connectionstring);
            conn.Open();
            if (conn.State != ConnectionState.Open)
            {
                // throw error
            }
        }
        catch (Exception ex)
        {
            if (conn != null && conn.State == ConnectionState.Open)
            {
                conn.Close();
            }
            conn = null;
        }

        // return the connection
        return conn;
    }
}

(当前)从MyMapper("User",{<Object from HTTP Post>})返回的数据类型为System.Object,因为MyMapper的类型为object

我想要的是动态更改数据类型以匹配模型...

MyMapper("User",{<Object from HTTP Post>}) =>数据类型= User

请记住,我可以对40种不同的表/模型进行CRUD,显然,直到运行时,我才知道要调用哪个表/模型。

(完成示例) ...我拿了MyMapper返回的对象并将其传递给connection.insert(...); (我修改了帖子以显示此内容-查看DbOperation)

有什么建议吗?有想法吗?

skiiyxia 回答:动态/在运行时更改方法数据类型

如果我理解您的问题,那么您正在尝试调用第三方(Dapper)泛型方法,而无需事先知道泛型类型参数,而该类型参数通常必须在编译时提供。

这可以是accomplished via Reflection。在包装器类(我相信您将其称为“ DbConnector”)中,添加一个名为“ InsertDynamicObject”的新方法,并对其进行编码,以使用Reflection查找要调用的方法定义。然后,您可以传递通用类型参数来调用MakeGenericMethod。一个示例可能如下所示:

namespace Dapper  //This is a stub for the Dapper framework that you cannot change
{
    class DbConnection
    {
        public void Insert<T>(T obj)
        {
            Console.WriteLine("Inserting an object with type {0}",typeof(T).FullName);
        }
    }
}

namespace MyProgram
{
    class DbConnector  //Here is your DbConnector class,which wraps Dapper
    {
        protected readonly Dapper.DbConnection _connection = new Dapper.DbConnection();

        public void InsertDynamicObject(object obj)
        {
            typeof(Dapper.DbConnection)
                .GetMethod("Insert")
                .MakeGenericMethod(new [] { obj.GetType() })
                .Invoke(_connection,new[] { obj });
        }
    }

    public class Program
    {
        public static void Main()
        {
            object someObject = "Test";  //This is the object that you deserialized where you don't know the type at compile time.

            var connector = new DbConnector();
            connector.InsertDynamicObject(someObject);
        }
    }
}

输出:

Inserting an object with type System.String

以下是DotNetFiddle上一个工作示例的链接:Link

本文链接:https://www.f2er.com/3135022.html

大家都在问