C# 理解问题=>Lambda运算符C
我对Lambda操作符=>有一个大致的理解,但我不明白变量z,c,s的属性从何而来,就像z.Name一样。有一些对象类型推理魔法正在发生,我不明白C# 理解问题=>Lambda运算符C,c#,linq,lambda,C#,Linq,Lambda,我对Lambda操作符=>有一个大致的理解,但我不明白变量z,c,s的属性从何而来,就像z.Name一样。有一些对象类型推理魔法正在发生,我不明白 public class DbReadService : IDbReadService { private VODContext _db; public DbReadService(VODContext db) { _db = db; } private (IEnumerable<st
public class DbReadService : IDbReadService
{
private VODContext _db;
public DbReadService(VODContext db)
{
_db = db;
}
private (IEnumerable<string> collections, IEnumerable<string> references) GetEntityNames<TEntity>() where TEntity : class
{
var dbsets = typeof(VODContext).GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(z => z.PropertyType.Name.Contains("DbSet"))
.Select(z => z.Name);
var properties = typeof(TEntity).GetProperties(BindingFlags.Public | BindingFlags.Instance);
var collections = properties.Where(l => dbsets.Contains(l.Name)).Select(s => s.Name);
var classes = properties.Where(c => dbsets.Contains(c.Name + "s")).Select(s => s.Name);
return (collections: collections, references: classes);
}
}
LINQ函数在通用IEnumerable上运行。当您在IEnumerable上调用任何LINQ函数时,例如List.wherec=>c.variable,c将是某个类型的实例。
在您的示例中,我假设属性是属性的列表或数组,因此,c将是属性的实例。c只是从属性中枚举的所有项的占位符的任意名称,即c是这些属性中的每一个。在第2条中,选择完全相同的项目,即s。。名字的选择相当混乱。在我看来,总是选择x或p会更好。有关的文档将有所帮助。是的,Mat,类型推断确实是我的问题。我知道c参数可以是任何东西,但不知何故,c被推断为某种神秘的对象类型,以使.Name属性可用。我将用额外的代码重申这个问题。我知道c参数可以是任何东西不,它不可能是任何东西!!它可以命名为任何名称,但它将始终是属性列表中的一个元素。实际类型的推断方式与properties..TaW中的foreach var x中的推断方式相同。经过进一步检查,PropertyInfo的基本类型是MethodInfo,它确实具有Name属性。我想这个谜已经解开了。