gpt4 book ai didi

c# - 从 System.Linq 导入类型如何向其他类添加方法?

转载 作者:行者123 更新时间:2023-12-03 03:39:30 24 4
gpt4 key购买 nike

在学习有关 .net core Entity Framework 的教程时,我注意到在查看下面代码中 DbSet 的可用方法时,在插入 using System.Linq; 后与以前相比有很大不同。

        private static void SimpleSamuraiQuery()
{
using (var context = new SamuraiContext())
{
var samurais = context.Samurais. // Add(), Remove(), etc..
}
}

包含 using 语句后,我突然能够看到您期望看到的所有 Linq 方法,但这让我有点好奇,所以我决定按 F12 检查 DbSet 类: public abstract class DbSet<TEntity> : IQueryable<TEntity>, IEnumerable<TEntity>, IEnumerable, IQueryable, IAsyncEnumerable<TEntity>, IInfrastructure<IServiceProvider>, IListSource where TEntity : class

我注意到它实现了 System.Linq.IQueryable接口(interface),但在 DbSet 类本身中没有声明任何 Linq 方法。对我来说,这似乎有点奇怪,但我决定深入挖掘并查看 IQueryable接口(interface):

namespace System.Linq
{
//
// Summary:
// Provides functionality to evaluate queries against a specific data source wherein
// the type of the data is known.
//
// Type parameters:
// T:
// The type of the data in the data source.
public interface IQueryable<out T> : IEnumerable<T>, IEnumerable, IQueryable
{
}
}

什么鬼?请原谅我的法语,但是这里发生了什么?为什么写作using System.Linq似乎将更多方法“注入(inject)”到类中,为什么接口(interface)看起来是空的?

最佳答案

What is going on here? Why does writing using System.Linq seem to "inject" more methods into a class, and why is the interface is seemingly empty?

这些方法是扩展方法,它们由 using 发挥作用。指示。

您可以自己完成此操作。创建一个命名空间,其中包含具有可访问静态方法的静态类,其第一个形式标记为 this :

namespace Frobber
{
public interface IBlob
{
int Blob { get; }
}
public static class MyExtensions
{
public static int AddOne(this IBlob b)
{
return b.Blob + 1;
}
}
}
... elsewhere ...
using Frobber;
...
IBlob b = whatever();
int x = b.AddOne();

IEnumerable<T> 上的所有“LINQ”方法和IQueryable<T>实际上是扩展方法。此功能背后的原因是:IEnumerable<T>IQueryable<T>无论类类型是什么,方法都是相同的,因此将这些方法作为 IEnumerable<T> 契约的一部分会很麻烦。和IQuerable<T> 。相反,您只需实现它们一次,然后使用 using 让它们“发挥作用”。指令。

扩展方法的解析如下:如果“正常”重载解析无法找到适用的成员,那么我们开始寻找“已使用”命名空间的顶级成员的静态类;如果这些静态类具有适当名称的扩展方法,则第二轮重载决策将从这些方法作为候选方法开始。自 using指令可以发生在不同的嵌套级别,我们可能最终会进行第三轮重载决策,但实际上这种情况很少见。

why is the interface is seemingly empty?

界面不为空。我不知道你是如何看待界面内容的,但不管它是什么,肯定出了问题。

IQueryable<T>已有成员(member)ElementType , ProviderExpression 。请参阅https://learn.microsoft.com/en-us/dotnet/api/system.linq.iqueryable?view=netframework-4.8了解详情。

关于c# - 从 System.Linq 导入类型如何向其他类添加方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59718531/

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