簡體   English   中英

如何獲取實體中所有屬性的名稱?

[英]How to get all names of properties in an Entity?


我要做的是將實體 object 傳遞給方法並返回其中屬性的所有名稱。
我正在使用此代碼來獲取所有道具名稱:

return classObject.GetType().GetProperties();

問題是當我將它與實體 Object 一起使用時,此代碼返回“EntityKey”和“EntityState”作為屬性。
有什么辦法嗎?

提前感謝

您想要所有直接屬性,但不想要基本類型的屬性,在您的情況下是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 所述,但如果您需要性能並且想要在循環中執行此操作,請注意。 反思不是一件快速的事情。

如果您需要性能,您可能希望在基礎 class 中放置一個虛擬方法,以將屬性作為字符串數組或其他內容檢索,並在所有派生類中覆蓋該屬性。 這將是最快的方法,但需要更多的編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM