gpt4 book ai didi

c# - 是否可以更改 Func 委托(delegate)的泛型类型参数?

转载 作者:太空狗 更新时间:2023-10-30 01:07:33 24 4
gpt4 key购买 nike

我想这个问题的答案是“否”,但无论如何还是要这样。

基本上,我有一个 Linq2Sql数据提供者及其生成的类型。我还有一些业务对象,其属性名称(为了这个问题)与它们相关的生成类型的属性名称完全匹配。业务类型在整个应用程序中使用,生成的类型仅用于访问数据库 - 由于多种原因,此设置是可取的,因此请不要建议需要对此进行任何更改的答案。

在 UI 层中,有各种控件允许用户调整搜索方式,例如。要搜索哪些字段、搜索词等。使用这些控件,我可以创建一个漂亮的 Func<T, bool>委托(delegate)封装搜索条件/查询。我遇到的问题是 Func委托(delegate)是用 T 创建的类型参数是业务对象,当它传递到数据访问层时,我需要它是相关的生成类型。

所以我的问题是,是否可以在保持相同条件的情况下将 Func 委托(delegate)的泛型类型参数从业务对象类型更改为相关的生成类型?

eg. can Func<MasterTrack, bool>   =>   Func<DbMasterTrack, bool> when properties match?

另请注意,我可以将所有用户选择的搜索参数传递给数据访问层,但其中有很多,所以我希望避免这种情况。

最佳答案

我不认为这是可能的,但您可以通过执行以下操作来逃脱惩罚:

  • 制作DbMasterTrack隐式转换为 MasterTrack ;
  • 查询时只需包装你的 Func<MasterTack,bool>Func<DbMasterTrack,bool> .

我还必须注意,如果您使用的是 Func<T, bool>而不是 Expression<Func<T, bool>您并没有真正在数据库级别过滤结果集,但您可能已经意识到这一点。

示例如下:

class MasterTrack
{
public int Id { get; set; }
public string Name { get; set; }
}
class DbMasterTrack
{
public int Id { get; set; }
public string Name { get; set; }
public static implicit operator MasterTrack(DbMasterTrack @this)
{
return new MasterTrack { Id = @this.Id, Name = @this.Name };
}
}
class Program
{
static void Main(string[] args)
{
var tracks = new List<DbMasterTrack>
{
new DbMasterTrack { Id = 1, Name = "T1" },
new DbMasterTrack { Id = 2, Name = "T2" },
};

Func<MasterTrack, bool> query = t => t.Id == 1;

var result = tracks.Where((Func<DbMasterTrack, bool>)(t => query(t)));

foreach (var item in result)
{
Console.WriteLine("{0}|{1}", item.Id, item.Name);
}
}
}

关于c# - 是否可以更改 Func<T, bool> 委托(delegate)的泛型类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11986085/

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