zoukankan      html  css  js  c++  java
  • 动态创建匿名对象利用表达式树动态构建分组条件

    public Type GetMyType(Dictionary<string, Type> dic)
    {

    string strDynamicModuleName = "dynamic";
    string strDynamicClassName = "<>dynamic";
    AppDomain currentDomain = System.AppDomain.CurrentDomain;
    AssemblyName assemblyName = new AssemblyName();
    assemblyName.Name = strDynamicModuleName;

    AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);

    ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(strDynamicModuleName);

    TypeBuilder typeBuilder = moduleBuilder.DefineType(strDynamicClassName, TypeAttributes.Public);

    Type[] methodArgs = { typeof(string) };

    typeBuilder.DefineDefaultConstructor(MethodAttributes.Public);


    ConstructorBuilder constructorBuiler = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { typeof(string), typeof(int) });

    // typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard);
    //typeBuilder.d
    //动态创建字段
    // FieldBuilder fb = typeBuilder.DefineField(item, typeof(System.String), FieldAttributes.Private);
    //ILGenerator ilg = constructorBuiler.GetILGenerator();//生成 Microsoft 中间语言 (MSIL) 指令
    //ilg.Emit(OpCodes.Ldarg_0);
    //ilg.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
    //ilg.Emit(OpCodes.Ldarg_0);
    //ilg.Emit(OpCodes.Ldarg_1);

    ////ilg.Emit(OpCodes.Stfld);
    //ilg.Emit(OpCodes.Ret);

    int index = 0;
    ILGenerator ilg = constructorBuiler.GetILGenerator();
    foreach (string item in dic.Keys)
    {

    //typeBuilder.DefineConstructor(MethodAttributes.Assembly, CallingConventions.VarArgs, new Type[] { typeof(string), typeof(int) });

    //动态创建字段
    //FieldBuilder fb = typeBuilder.DefineField("_" + item, dic[item], FieldAttributes.Private);

    //类型的属性成员由两部分组成,一是私有字段,二是访问私有字段的属性包装器。
    //包装器运行时的本质与 Method 一样,即包含 Set_Method 和 Get_Method 两个方法。
    //动态创建字段
    FieldBuilder fieldBuilder = typeBuilder.DefineField(dic[item].Name + "_" + item, dic[item], FieldAttributes.Public);

    //FieldBuilder conFieldBuilder = typeBuilder.DefineField(item.ToLower(), dic[item], FieldAttributes.Public);


    index++;
    ilg.Emit(OpCodes.Ldarg_0);//向MSIL流发送属性实例
    ilg.Emit(OpCodes.Ldarg, index);//将指定索引的参数加到堆栈上。
    ilg.Emit(OpCodes.Stfld, fieldBuilder);//装载字段

    //ilg.Emit(OpCodes.Stfld, fieldBuilder);

    PropertyBuilder propertyBuilder = typeBuilder.DefineProperty(item, PropertyAttributes.None, dic[item], null);
    //MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;
    MethodBuilder methodBuilder = typeBuilder.DefineMethod("get_" + item, MethodAttributes.Public, dic[item], null);

    ILGenerator ilGenerator = methodBuilder.GetILGenerator();
    ilGenerator.Emit(OpCodes.Ldarg_0);
    ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder);//装载属性私有字段
    ilGenerator.Emit(OpCodes.Ret);
    propertyBuilder.SetGetMethod(methodBuilder);// 设置获取属性值的方法

    methodBuilder = typeBuilder.DefineMethod("set_" + item,
    MethodAttributes.Public,
    typeof(void), new Type[] { dic[item] });

    ilGenerator = methodBuilder.GetILGenerator();
    ilGenerator.Emit(OpCodes.Ldarg_0);
    ilGenerator.Emit(OpCodes.Ldarg_1);
    ilGenerator.Emit(OpCodes.Stfld, fieldBuilder);
    ilGenerator.Emit(OpCodes.Ret);
    propertyBuilder.SetSetMethod(methodBuilder);// 设置属性值的方法


    }
    ilg.Emit(OpCodes.Ret);
    Type type = typeBuilder.CreateType();

    //Type typeDynamic = moduleBuilder.GetType(strDynamicClassName);
    //object objReturn = Activator.CreateInstance(typeDynamic, "Admin", 90);

    object objReturn = Activator.CreateInstance(type, "Admin", 90);

    return type;

    }

    public async Task AddDistributionExcelDataAsync(List<IN_PnoDetail> listDetail, string TripCode, string checkedList)
    {

    //1.组建运单
    var tripEntity = new IN_Trip();
    tripEntity.InitEntity();
    tripEntity.TripCode = TripCode;

    var service_trip = Service.GetIQueryable<IN_Trip>();
    var service_order = Service.GetIQueryable<IN_Order>();

    //await Service.InsertAsync(tripEntity);
    List<IN_PnoDetail> newListDetail = new List<IN_PnoDetail>();
    List<IN_Order> newListOrder = new List<IN_Order>();
    //2.组建入库单和详情
    IEnumerable<IGrouping<string, IN_PnoDetail>> groups = null;

    listDetail.GroupBy(p =>new{p.SupplierCode });
    if (checkedList.Contains("供应商"))
    {
    var groups1 = listDetail.GroupBy(p => new { p.SupplierCode,p.ProductCode });
    }

    //var type = typeof(IN_PnoDetail);
    //var propertyName = "SupplierCode";
    //var param = Expression.Parameter(type, type.Name);
    //var body = Expression.Property(param, propertyName);
    //var keySelector = Expression.Lambda<Func<IN_PnoDetail, dynamic>>(body, param);
    //var k = keySelector.Compile();
    //var ty = keySelector.GetType();
    //var ty1 = typeof(Func<IN_PnoDetail, string>);
    //var m = ty == ty1;
    //var groupsd = listDetail.GroupBy(k);

    string[] namelist = new string[] { "SupplierCode", "ProductCode" };
    Dictionary<string, Type> dic = new Dictionary<string, Type>();
    dic.Add("SupplierCode", typeof(string));
    dic.Add("ProductCode", typeof(string));

    Type type= GetMyType(dic);

    var param = Expression.Parameter(typeof(IN_PnoDetail), typeof(IN_PnoDetail).Name);

    try
    {
    List<MemberBinding> newBindings = new List<MemberBinding>();
    NewExpression newBody = Expression.New(type);

    type.GetProperties().ForEach(aProperty =>
    {

    MemberInfo newMember = type.GetMember(aProperty.Name)[0];
    MemberBinding newMemberBinding = Expression.Bind(newMember, Expression.Property(param, aProperty.Name));
    newBindings.Add(newMemberBinding);
    });
    MemberInitExpression body = null;

    body = Expression.MemberInit(newBody, newBindings.ToArray());
    var keySelector = Expression.Lambda<Func<IN_PnoDetail, dynamic>>(body, param);
    var k = keySelector.Compile();
    var groupsd = listDetail.GroupBy(k);
    }
    catch (Exception e)
    {

    throw;
    }


    var q = from a in service_order.AsExpandable()
    join b in service_trip.Where(c => c.TripCode == TripCode)
    on a.In_TripId equals b.Id into ab
    select ab.Count();
    int number = q.FirstOrDefault();

    if (groups != null)
    {
    foreach (var item in groups)
    {
    number = number + 1;
    IN_Order inorder = new IN_Order() { In_TripId = tripEntity.Id, InOrderCode = $"{TripCode}_{number}" };
    inorder.InitEntity();
    inorder.State = "未作业";
    newListOrder.Add(inorder);

    //await Service.InsertAsync(inorder);
    foreach (var itemDetai in item)
    {
    itemDetai.InitEntity();
    itemDetai.OrderId = inorder.Id;
    itemDetai.TripId = tripEntity.Id;
    itemDetai.State = "未作业";
    newListDetail.Add(itemDetai);
    }
    }
    }
    else
    {
    number = number + 1;
    IN_Order inorder = new IN_Order() { In_TripId = tripEntity.Id, InOrderCode = $"{TripCode}_{number}" };
    inorder.InitEntity();
    inorder.State= "未作业";
    newListOrder.Add(inorder);

    newListDetail = listDetail;
    newListDetail.ForEach(a => {
    a.InitEntity();
    a.OrderId = inorder.Id;
    a.TripId = tripEntity.Id;
    a.State = "未作业";
    a.AlreadyNum = 0;
    });
    }
    //await Service.InsertAsync(newListDetail);

    var res = await RunTransactionAsync(async () =>
    {
    await Service.InsertAsync(tripEntity);
    await Service.InsertAsync(newListOrder);
    await Service.InsertAsync(newListDetail);
    });
    if (res.Success)
    {

    }
    else
    throw new Exception("系统异常", res.ex);

    //1.保存所有分配明细
    //1.1转换类型

    //2.按照条件分组生成入库订单和明细

    //3.插入运单和运单明细

    //4,插入入库单和入库单明细
    }

    #endregion

    #region 私有成员

    #endregion


    }

  • 相关阅读:
    C#利用反射动态调用类及方法
    系统程序监控软件
    SQL server 2008 安装和远程访问的问题
    sql server 创建临时表
    IIS 时间问题
    windows 2008 安装 sql server 2008
    sql server xml nodes 的使用
    Window 7sp1 安装vs2010 sp1 打开xaml文件崩溃
    CSS资源网址
    Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0
  • 原文地址:https://www.cnblogs.com/yzmn/p/12975539.html
Copyright © 2011-2022 走看看