gpt4 book ai didi

c# - 在 Linq 中使用 .NET 4 动态关键字的好例子?

转载 作者:IT王子 更新时间:2023-10-29 04:48:58 24 4
gpt4 key购买 nike

所以我刚从亚马逊得到了关于 LINQ to Objects Using C# 4.0: Using and Extending LINQ to Objects and Parallel LINQ (PLINQ) 的推荐.

它说这本书介绍了在 Linq 中使用 dynamic 关键字,这让我想到:

您可以使用 dynamic 关键字做出什么样的令人惊叹的事情,而您不能用其他方式使用 Linq?

最佳答案

这是一个想法:通过将 LINQ 与动态相结合,您可以查询未类型化的数据集,就好像它们是有类型的。

例如,假设 myDataSet 是一个无类型数据集。使用动态类型和称为 AsDynamic() 的扩展方法,以下是可能的:

var query = from cust in myDataSet.Tables[0].AsDynamic()
where cust.LastName.StartsWith ("A")
orderby cust.LastName, cust.FirstName
select new { cust.ID, cust.LastName, cust.FirstName, cust.BirthDate };

下面介绍如何定义 AsDynamic 扩展方法。请注意它如何返回动态的 IEnumerable,这使其适用于 LINQ 查询:

public static class Extensions
{
public static IEnumerable<dynamic> AsDynamic (this DataTable dt)
{
foreach (DataRow row in dt.Rows) yield return row.AsDynamic();
}

public static dynamic AsDynamic (this DataRow row)
{
return new DynamicDataRow (row);
}

class DynamicDataRow : DynamicObject
{
DataRow _row;
public DynamicDataRow (DataRow row) { _row = row; }

public override bool TryGetMember (GetMemberBinder binder, out object result)
{
result = _row[binder.Name];
return true;
}

public override bool TrySetMember (SetMemberBinder binder, object value)
{
_row[binder.Name] = value;
return true;
}

public override IEnumerable<string> GetDynamicMemberNames()
{
return _row.Table.Columns.Cast<DataColumn>().Select (dc => dc.ColumnName);
}
}
}

通过对 DynamicObject 进行子类化,这可以利用自定义绑定(bind) - 您可以自己接管解析成员名称的过程。在这种情况下,我们将 get 和 set 成员访问权限绑定(bind)到在底层 DataRow 中检索或存储对象。

关于c# - 在 Linq 中使用 .NET 4 动态关键字的好例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4117713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com