/// <summary> /// 获取原生BulkCopy /// </summary> /// <param name="classBulkCopyName"></param> /// <param name="classRowsCopiedName"></param> /// <param name="oType"></param> /// <returns></returns> private long _GetBulkCopyAndWriteToServer(string classBulkCopyName, string classRowsCopiedName, object[] args) { _completedCount = 0; var assembly = Factory.GetAssembly(this.DbType); var NameSpace = Factory.GetNamespace(this.DbType + ""); var copyer = assembly.CreateInstance($"{NameSpace}.{classBulkCopyName}", true, BindingFlags.Default, null, new object[] { this._client.ConnectionString }, null, null); var oType = copyer.GetType(); oType.GetProperty("DestinationTableName")?.SetValue(copyer, this.DestinationTableName, null); oType.GetProperty("BulkCopyTimeout")?.SetValue(copyer, this.BulkTimeout, null); //oType.GetProperty("BatchSize")?.SetValue(copyer, this.BatchSize, null); oType.GetProperty("BatchSize")?.SetValue(copyer, 1, null); oType.GetProperty("NotifyAfter")?.SetValue(copyer, this.NotifyAfter, null); var ColumnMappings = oType.GetProperty("ColumnMappings"); _CopyMaps(ColumnMappings); EventInfo evt = oType.GetEvent(classRowsCopiedName); var delType = evt.EventHandlerType; var pts = delType.GetDelegateParameterTypes(); MethodInfo doEventMethod = this.GetType().GetMethod(nameof(bc_RowsCopied), BindingFlags.NonPublic | BindingFlags.Instance); MethodInfo concreteDoEventMethod = doEventMethod.MakeGenericMethod(pts[1]); Delegate d = Delegate.CreateDelegate(delType, this, concreteDoEventMethod); evt.AddEventHandler(copyer, d); var wtServer = oType.GetMethod("WriteToServer", DelegateBuilder.GetParamsTypesFromParameters(args)); wtServer.Invoke(copyer, args); return(_completedCount); }
private static Delegate _GetEmitCreateFunc(Type type, object[] args, Type[] argTypes) { Delegate fun; if (argTypes != null) { fun = DelegateBuilder.GetCreateDelegate(type, argTypes); } else { fun = DelegateBuilder.GetCreateDelegate(type, DelegateBuilder.GetParamsTypesFromParameters(args)); } return(fun); }