【问题标题】:How to get dynamic type property?如何获取动态类型属性?
【发布时间】:2017-01-15 23:03:10
【问题描述】:

我有一个项目,我应该在其他层放置一些代码,因此我应该将 linq 查询转移到方法。 这段代码:

var HRPersonnelContactInfoTelService = App.Api.HRPersonnelContactInfoTelService.Instance().Data();
        var SMSGroupMemberService = App.Api.SMSGroupMemberService.Instance().Data();
        return (from x in SMSGroupMemberService
                where Recivers.Contains(x.GroupID)
                join v in HRPersonnelContactInfoTelService on x.Pers_Code equals v.Pers_Code
                select new { Pers_Code = (int)x.Pers_Code, Tel = v.Tel }).ToList();

我将代码转换为:

public dynamic HRPersonnelContactInfoTelMethod(List<int> Recivers)
    {
        var HRPersonnelContactInfoTelService = App.Api.HRPersonnelContactInfoTelService.Instance().Data();
        var SMSGroupMemberService = App.Api.SMSGroupMemberService.Instance().Data();
        return (from x in SMSGroupMemberService
                where Recivers.Contains(x.GroupID)
                join v in HRPersonnelContactInfoTelService on x.Pers_Code equals v.Pers_Code
                select new { Pers_Code = (int)x.Pers_Code, Tel = v.Tel }).ToList();
    }

但是当我在 foreach 中使用它时

System.Core.dll 中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的异常,但未在用户代码中处理

附加信息:“object”不包含“Pers_Code”的定义

像这样使用它:

var q = App.Api.HRPersonnelContactInfoTelService.Instance().HRPersonnelContactInfoTelMethod(Recivers);
        foreach (var item in Recivers)
        {
            var res = App.Api.SMSMessageGroupService.Instance().AddOrUpdate(null, MessageId, item);
        }
        foreach (var z in q)
        {
            string SendNumber = Number[1].Trim().Substring(0, 3) == "+98" ? Number[1].Trim() : "+98" + Number[1].Trim();
            var res = App.Api.SMSMessageLogService.Instance().AddOrUpdate(null, MessageId, (int)z.Pers_Code, z.Tel.ToString(),
                 0, int.Parse(ddlSMSWorkingGroups.SelectedValue.ToString()), (int)z.Pers_Code, SendNumber, 0);
            send.SendSMS("nazmaran", "qwerty", SendNumber, "09122596898", txtPredefinedRemarks.Text);
        }

【问题讨论】:

  • 添加一些关于如何使用它的代码

标签: c# linq dynamictype


【解决方案1】:

我永远不会使用动态来返回使用匿名类型来投影结果的 linq 查询的结果。相反,我会创建一个保存结果的类:

public class SomeName
{
   public int Pers_Code { set; get; }
   public string /* Change to Correct Type */ Tel { set; get;}
}

用法:

public List<SomeName> HRPersonnelContactInfoTelMethod(List<int> Recivers)
{
   var HRPersonnelContactInfoTelService = App.Api.HRPersonnelContactInfoTelService.Instance().Data();
   var SMSGroupMemberService = App.Api.SMSGroupMemberService.Instance().Data();
   return (from x in SMSGroupMemberService
           where Recivers.Contains(x.GroupID)
           join v in HRPersonnelContactInfoTelService on x.Pers_Code equals v.Pers_Code
           select new SomeName() { Pers_Code = (int)x.Pers_Code, Tel = v.Tel }).ToList();
}

与使用动态的复杂性相比,创建一个类型来保存结果是微不足道的。

【讨论】:

  • 它不起作用抛出:无法将类型'System.Collections.Generic.List>'隐式转换为'System.Collections.Generic.List'
【解决方案2】:

.NET 似乎无法使用var 和通过动态的迭代器执行动态类型化,从而呈现对象列表。

因此,当您使用 var 创建变量时 - .NET 无法预测返回类型并创建一个新的 object 变量,因为每种类型都继承自 object

但是,将返回类型实现为 dynamic 是一种不好的做法 - 直到您不调用此方法才能找到可能的错误。因此,按照@user3185569 的建议,实现另一个类的用法。

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 2017-05-27
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多