作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想这个问题的答案是“否”,但无论如何还是要这样。
基本上,我有一个 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/
我是一名优秀的程序员,十分优秀!