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

本文关键字:属性 有名称 实体 何获取 获取 | 更新日期: 2023-09-27 17:54:20


我要做的是将一个实体对象传递给方法,并返回其中所有属性的名称。
我用这个代码来获取所有道具的名称:

return classObject.GetType().GetProperties();

问题是,当我将"EntityKey"answers"EntityState"与EntityObject一起使用时,此代码会将其作为属性返回
有什么办法吗?

提前Thanx

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

您想要所有直接属性,但不想要基类型的属性,在您的情况下是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));

这个示例假设有一个基类型(DB首先是这样(,在不能保证的情况下进行重构

编辑来自@Matt的评论:以上所有内容都是不必要的,如果我没有想到这一点,我可能会大吃一惊——只需使用正确的绑定标志:

return classObject.GetType().GetProperties(BindingFlags.DeclaredOnly | 
                                           BindingFlags.Public | 
                                           BindingFlags.Instance);

也可以不反射:

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();
}

正如你所看到的,你可以访问更多的名字。该示例显示您现在可以确定哪个属性是密钥的一部分。如果您直接访问Members,您可以知道哪个属性是标量、复杂类型或导航属性。

所有信息都已加载,因此无需进行反思。如果你想使用反射,不要忘记只使用一次(第一次需要时(,然后存储和重用收到的属性名称。反射很慢,所以每次需要名字时都使用它是一种糟糕的做法。

我也遇到了同样的问题。我找到的解决方案是用要返回的属性的名称创建一个数组(我只需要几个(。在您的情况下,由于跟踪所有属性可能很费力,因此我会过滤属性EntityKeyEntityState并返回所有其他属性。代码应该是这样的:

public IEnumerable<PropertyInfo> GetProperties()
{
    Type t = this.GetType();
    return t.GetProperties()
        .Where(p => (p.Name != "EntityKey" && p.Name != "EntityState"))
        .Select(p => p).ToList();
}

不知道是否有更好的解决方案,但它会很好;(希望它能有所帮助!

正如BrokenGlass所说,但如果您需要性能并且希望在循环中做到这一点,请小心。反射不是一件快速的事情。

如果您需要性能,您可能希望在基类中放置一个虚拟方法,以字符串数组或其他形式检索属性,并在所有派生类中重写它。这将是fastes方法,但需要更多的编码。