簡體   English   中英

如何通過Activator.CreateInstance將對象實例化,並使用Dapper將其插入表中

[英]How to instanciate an object by Activator.CreateInstance an inserting it on a table using Dapper

我正在嘗試使用Dapper.Contrib.Extensions庫在數據庫中插入“ClassName”類的實例,我正在使用.NET Framework 4.6.1的Activator.CreateInstance方法,因為我只是在文本中具有類名稱所以我無法實現一個直接調用該類的對象。

轉換ClassName按預期工作 但我無法使用這種方式,因為“ClassName”只是我從XML文件中獲取的文本。

   private void InsertByDapper(string className, SqlConnection conn)
    {
        Type type = Type.GetType(className);
        if (type != null)
        {
            var instance = Activator.CreateInstance(type);

            // ... update some properties in the instance object...

            conn.Insert(instance);

            //connTo.Insert((ClassName)instance); //This statment works
        }
    }

.NET中拋出的異常: System.Data.SqlClient.SqlException:''附近的語法不正確')'。'

錯誤說明:Dapper正在嘗試將對象插入Objects表中。 我的目的是將它插入className表。

SQL錯誤:插入Objects()values();選擇SCOPE_IDENTITY()id

我猜你正在使用泛型參數TEntity或類似的泛型方法。 由於您為它提供了類型對象,因此它將使用它。 您可能應該使用非通用方法。

編輯:Yepp,我的猜測是對的。

https://github.com/StackExchange/Dapper/blob/master/Dapper.Contrib/SqlMapperExtensions.cs#L332

而且有趣的是,該方法沒有通用的重載。 您可以使用反射來使用正確的泛型參數調用泛型方法

例如,確保從MakeGenericMethod緩存結果,這是昂貴的

typeof(SqlMapperExtensions).GetMethod(nameof(SqlMapperExtensions.Insert)).MakeGenericMethod(instance.GetType()).Invoke(null, new object[] { conn,  instance, null, null});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM