![](/img/trans.png)
[英]How to get the names of all properties (without their values) in a json object?
[英]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
,您可以知道哪個屬性是標量、復雜類型或導航屬性。
所有信息都已加載,因此無需反思。 如果您想使用反射,請不要忘記只使用一次(第一次需要它),然后存儲並重用收到的屬性名稱。 反射很慢,因此每次需要名稱時都使用它是一種不好的做法。
我有同樣的問題。 我找到的解決方案是創建一個帶有要返回的屬性名稱的數組(我只需要一些)。 在您的情況下,由於跟蹤所有屬性可能很費力,因此我將過濾屬性EntityKey
和EntityState
並返回所有其他屬性。 代碼將是這樣的:
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.