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

时间:2011-05-01 20:44:25

标签: c# entity-framework


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

return classObject.GetType().GetProperties();

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

提前完成

4 个答案:

答案 0 :(得分: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));

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

来自@Matt评论的

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

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

答案 1 :(得分: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();
}

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

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

答案 2 :(得分:2)

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

public IEnumerable<PropertyInfo> GetProperties()
{
    Type t = this.GetType();

    return t.GetProperties()
        .Where(p => (p.Name != "EntityKey" && p.Name != "EntityState"))
        .Select(p => p).ToList();
}

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

答案 3 :(得分:1)

正如BrokenGlass所述,但要注意你是否需要性能并且想要在循环中执行此操作。反思不是一件快事。

如果需要性能,您可能希望在基类中放置一个虚方法,以将字符串或其他类型的数据检索到属性,并覆盖所有派生类中的属性。这将是紧凑的方法,但有更多的编码。