如何在实体中获取所有属性名称?

Dab*_*bas 9 c# entity-framework


我要做的是将实体对象传递给方法并返回其中所有属性的名称.
我正在使用此代码获取所有道具名称:

return classObject.GetType().GetProperties();
Run Code Online (Sandbox Code Playgroud)

问题是,当我将它与Entity Object一起使用时,此代码将"EntityKey"和"EntityState"作为属性返回.
有什么办法吗?

Thanx提前

Bro*_*ass 22

您需要所有直接属性,但不需要基本类型的属性,在您的情况下是EntityObject:

var type = classObject.GetType();
//alternatively call out directly: typeof(EntityObject).GetProperties()...
var basePropertyNames = type.BaseType.GetProperties().Select(x => x.Name);
var props = type.GetProperties().Where(p => !basePropertyNames.Contains(p.Name));
Run Code Online (Sandbox Code Playgroud)

此示例假定存在基本类型(首先是DB的情况),重构时不保证.

编辑 @Matt的评论:以上所有内容都是不必要的,可能会因为没有考虑到这一点而低下头 - 只需使用正确的绑定标志:

return classObject.GetType().GetProperties(BindingFlags.DeclaredOnly | 
                                           BindingFlags.Public | 
                                           BindingFlags.Instance);
Run Code Online (Sandbox Code Playgroud)

  • 为什么不使用`classObject.GetType().GetProperties(BindingFlags.DeclaredOnly)`? (5认同)
  • @Matt:因为我是一个id*ot -fixing我的答案 (4认同)
  • 和@Matt:谢谢你的回答.@BrokenGlass:当我使用@Marrs修改过的代码时,我得到了属性,但是我得到了一些我不想要的属性,这是导航属性所以我修改了一点代码,现在它起作用了:'var basePropertyNames = classObject.GetType ().BaseType.GetProperties().选择(x => x.Name); return classObject.GetType().GetProperties().Where(p =>!basePropertyNames.Contains(p.Name)&&!p.PropertyType.IsClass).Select(x => x.Name);' 我不知道这是否适用于所有实体或不适用. (2认同)

Lad*_*nka 8

没有反思也是可能的:

using (var context = new ModelContainer())
{
    // Access CSDL
    var container = context.MetadataWorkspace
                           .GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace);
    // Access name of related set exposed on your context
    var set = container.BaseEntitySets[context.YourEntitySet.EntitySet.Name];
    // Access all properties
    var properties = set.ElementType.Members.Select(m => m.Name).ToList();
    // Access only keys
    var keys = set.ElementType.KeyMembers.Select(m => m.Name).ToList();
}
Run Code Online (Sandbox Code Playgroud)

如您所见,您可以访问更多名称.该示例显示您现在可以将哪个属性作为键的一部分.如果Members直接访问,您可以知道哪个属性是标量,复杂类型或导航属性.

所有信息都已加载,因此无需反思.如果您想使用反射,请不要忘记只使用它一次(第一次需要它),然后存储并重用接收的属性名称.反思很慢所以每次需要名字时使用它都是一种不好的做法.