簡體   English   中英

分配給對象的動態屬性

[英]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;

然后以某種方式將 NumberOfWallsroom關聯為其屬性?

更新(大圖):



我有一個緩存的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.

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