当前位置: 首页 > 编程语言 > C#

如何获取实体中的所有属性名?分享

时间:2023-04-10 22:32:00 C#

如何获取实体中的所有属性名?我要做的是将实体对象传递给方法并返回其中所有属性的名称。我正在使用此代码获取所有道具名称:returnclassObject.GetType().GetProperties();问题是,当我将它与实体对象一起使用时,此代码返回“EntityKey”和“EntityState”作为属性。解决办法是什么?提前完成您需要所有直接属性,但不需要基本类型的属性,在您的情况下是EntityObject:vartype=classObject.GetType();//或者直接调用:typeof(EntityObject).GetProperties()...varbasePropertyNames=type.BaseType.GetProperties().Select(x=>x.Name);varprops=type.GetProperties().Where(p=>!basePropertyNames.Contains(p.Name));这个例子假设有一个基类型(首先是DB的情况),重构时不能保证。编辑@Matt的评论:以上所有内容都是不必要的,可能会因为没有考虑到这一点而被嘲笑-只需使用正确的绑定标志:returnclassObject.GetType().GetProperties(BindingFlags.DeclaredOnly|BindingFlags.Public|BindingFlags.Instance);没有反射也是可能的://访问暴露在上下文中的相关集的名称varset=container.BaseEntitySets[context.YourEntitySet.EntitySet.Name];//访问所有属性varproperties=set.ElementType.Members.Select(m=>m.Name).ToList();//仅访问键varkeys=set.ElementType.KeyMembers.Select(m=>m.Name).ToList();如您所见,您可以访问更多名称。此示例显示您现在可以将哪个属性作为键的一部分。如果您直接访问Members,您可以知道哪个属性是标量、复杂类型或导航属性。所有信息都已加载,因此不需要反射。如果要使用反射,不要忘记只使用一次(第一次需要),然后存储并重复使用接收到的属性名。反射很慢,所以每次需要一个名字时都使用它是一种不好的做法。我也有同样的问题。我找到的解决方案是创建一个数组,其中包含要返回的属性的名称(我只需要几个)。在您的情况下,由于跟踪所有属性可能很费力,因此我会过滤属性EntityKey和EntityState并返回所有其他属性。代码将是这样的:publicIEnumerableGetProperties(){Typet=this.GetType();返回t.GetProperties().Where(p=>(p.Name!="EntityKey"&&p.Name!="EntityState")).Select(p=>p).ToList();不知道是否有更好的解决方案,但它会很好;)希望它有所帮助!正如BrokenGlass所说,但如果您需要性能并且想循环执行它,请当心。反思不是一件很快的事情。如果您需要性能,您可能希望在基类中放置一个虚拟方法来检索字符串或其他类型的数据作为属性,并在所有派生类中覆盖该属性。这将是紧凑的方法,但编码更多。以上就是C#学习教程:如何获取实体中的所有属性名?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: