如何获取动态类型属性?
How to get dynamic type property?
我有一个项目,我应该在其他层放置一些代码,因此我应该将 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 中使用它时
An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code
Additional information: 'object' does not contain a definition for '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);
}
我绝不会使用动态 return 使用匿名类型来投影结果的 linq 查询的结果。相反,我会创建一个 class 来保存结果:
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();
}
创建一个类型来保存结果与使用动态的复杂性相比是微不足道的。
看来,.NET 无法使用 var
和迭代器通过动态执行动态类型化,它提供了一个对象列表。
因此,当您使用 var
创建变量时 - .NET 无法预测 return 类型并创建新的 object
变量,因为每种类型都继承自 object
.
但是,将 return 类型实现为 dynamic
是一种不好的做法 - 除非您不调用此方法,否则无法发现可能的错误。因此,按照 @user3185569 的建议实现另一个 class 的用法。
我有一个项目,我应该在其他层放置一些代码,因此我应该将 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 中使用它时
An exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in System.Core.dll but was not handled in user code
Additional information: 'object' does not contain a definition for '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);
}
我绝不会使用动态 return 使用匿名类型来投影结果的 linq 查询的结果。相反,我会创建一个 class 来保存结果:
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();
}
创建一个类型来保存结果与使用动态的复杂性相比是微不足道的。
看来,.NET 无法使用 var
和迭代器通过动态执行动态类型化,它提供了一个对象列表。
因此,当您使用 var
创建变量时 - .NET 无法预测 return 类型并创建新的 object
变量,因为每种类型都继承自 object
.
但是,将 return 类型实现为 dynamic
是一种不好的做法 - 除非您不调用此方法,否则无法发现可能的错误。因此,按照 @user3185569 的建议实现另一个 class 的用法。