[英]Dynamic property assigned to object
是否可以將dynamic
屬性附加到用戶定義的類的對象?
public class Room
{
public int NumberOfDoors { get; set; }
public int NumberOfWindows { get; set; }
}
然后從其他上下文:
Room room = new Room();
dynamic contact = new ExpandoObject();
contact.NumberOfWalls = 4;
然后以某種方式將 NumberOfWalls
與room
關聯為其屬性?
我有一個緩存的List<Room>
在剃刀視圖(主題文件夾外部)中被迭代,調用
每個元素的特定局部視圖(來自當前主題)。 主題之一需要額外
房間里的財產。 我只能修改該特定主題文件夾中的代碼,部分
查看cshtml文件(不要問為什么)。
所以它基本上是:
(偽碼)
Room.NoOfWalls = SomeHeavyLiftingProcess(Room.NoOfWindows, Room.NoOfDoors)
我正在尋找一種使用NoOfWalls更新List<Room> rooms
對象的方法
HttpRuntime.Cache["rooms"]
避免對每個請求調用SomeHeavyLiftingProcess()
。 該
目標是在緩存的對象中注入屬性。 不幸的是HttpRuntime.Cache["rooms"]
是對象
輸入,不允許我這樣做:
HttpRuntime.Cache["rooms"][3]["NoOfWalls"] = SomeHeavyLiftingProcess(..)
所以我在想,對於第一個請求(當緩存為空或無效時):
解壓縮:檢索(List<Room>)HttpRuntime.Cache["room"]
,將NoOfWalls注入當前的Room對象中。
重新打包:使用新對象更新List<Room> room
,並將其分配回HttpRuntime.Cache
。
對於后續請求,NoOfWalls的值將來自緩存的對象@Model.NoOfWalls
。
如果不使用ExpandoObject
類的動態對象,則無法將類中未定義的屬性添加到現有實例中。
如果需要將成員添加到現有類,則可以使用特殊的構造函數創建子類:
public class SpecialRoom : Room
{
public SpecialRoom() { }
public SpecialRoom(Room copy)
{
this.NumberOfDoors = copy.NumberOfDoors;
this.NumberOfWindows = copy.NumberOfWindows;
}
public int NumberOfJacuzzis { get; set; }
}
用法:
var room = new Room();
room.NumberOfDoors = 3;
var specialRoom = new SpecialRoom(room)
{
NumberOfJacuzzis = 7
};
要么:
var listOfRooms = new List<Room>();
// ...
var listOfSpecialRooms = listOfRooms.Select(x => new SpecialRoom(x));
listOfSpecialRooms.ForEach(x => x.NumberOfJacuzzis = ComplexCalculation(x));
如果您有一個現有的具體對象(例如Room
類的實例),則可以使用以下方法將其轉換為動態對象:
public static dynamic ConvertObjectToDynamic(object value)
{
if (value == null)
{
return null;
}
IDictionary<string, object> dynamicObject = new ExpandoObject();
var properties = value.GetType().GetProperties(
BindingFlags.Public | BindingFlags.Instance);
foreach (var propertyInfo in properties)
{
if (propertyInfo.GetIndexParameters().Length == 0)
{
var propertyValue = propertyInfo.GetValue(value);
dynamicObject[propertyInfo.Name] = propertyValue;
}
}
return dynamicObject;
}
用法:
var room = new Room();
room.NumberOfDoors = 3;
dynamic dynamicObject = ConvertToDynamic(room);
dynamicObject.WhateverYouWant = 7;
現在, dynamicObject.NumberOfDoors
將為3, dynamicObject.WhateverYouWant
將為7。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.