2013-11-20 4 views
2

Можно ли связать объект 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, как его собственность?

Update (Увеличенное изображение):

согласно @ Навфалу-х внушениям

У меня есть кэшируются List<Room> итерируемые в представлении бритвы (вне папки темы), призывающий a

частный частичный вид (из текущей темы) для каждого элемента. Одна из тем нуждается в дополнительном

Недвижимость в комнате. У меня только есть доступ к изменению кода в этой конкретной папке темы, частичное

просмотров файлов cshtml (не спрашивайте, почему).

Таким образом, ее в основном:

(psuedocode)

Room.NoOfWalls = SomeHeavyLiftingProcess(Room.NoOfWindows, Room.NoOfDoors)


Ищу обновления путь О, List<Room> rooms объект с NoOfWalls в

HttpRuntime.Cache["rooms"] в не звонить SomeHeavyLiftingProcess() с каждым запросом.

Целью является введение объекта в кешированный объект. Unfortuntely HttpRuntime.Cache["rooms"] является объект

типа и не позволяет мне сделать это:

HttpRuntime.Cache["rooms"][3]["NoOfWalls"] = SomeHeavyLiftingProcess(..)

Так что я имею в виду, для первого запроса (если кэш пуст или недействителен):

  • Unpackig: Получить (List<Room>)HttpRuntime.Cache["room"], ввести NoOfWalls в текущий объект комнаты.

  • Переупаковка: обновите List<Room> room новым объектом и назначьте его обратно HttpRuntime.Cache.


Для последующих запросов, значение NoOfWalls будет поступать из кэшированных объекта @Model.NoOfWalls.

+1

некоторые онлайн примеры показывают, что ' ExpandoObject' используется как совершенно новый вид данных с произвольными членами, добавленными программистом. Это означает, что вы не можете достичь того, чего хотите. –

+0

Спасибо. Есть ли другой способ достижения такого динамического поведения, подобного JavaScript, в C#? – Annie

+1

Почему бы просто не использовать 'ExpandoObject'? Вам не нужна «Комната» (или, если необходимо, вы можете скопировать некоторые свойства из объекта ExpandoObject в объект Room), используя ExpandoObject, вы можете добавить все свойства «NumberOfDoors», «NumberOfWindows» и «NumberOfWalls». –

ответ

1

Нельзя добавлять свойства, не определенные в классе, в существующий экземпляр без использования динамического объекта, такого как 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.

+0

Спасибо за подробный ответ. Пожалуйста, ознакомьтесь с обновлениями, чтобы найти контекст, почему мне нужно ввести свойство в конкретный объект класса. – Annie

+0

@ Annie Я включил некоторые дополнительные детали. Я надеюсь, что это помогает. – Dan

+0

Спасибо. Это помогло. – Annie

Смежные вопросы