2012-06-29 9 views
2

Я прочитал статью об объекте expando here, но я хочу достичь другой цели.
Я хочу, чтобы добавить объект свойства с динамическим свойством во время выполнения, поставить значение на него, а затем получить их позже:Как добавить свойство объекта на expando во время выполнения?

private static readonly ConditionalWeakTable<object, ExpandoObject> props = new ConditionalWeakTable<object, ExpandoObject>(); 
    public static void AddDataExtension(this object key, dynamic value) 
    { 
     props.Add(key, value); 
    } 

    public static dynamic GetDataExtension(this object key) 
    { 
     ExpandoObject ex = null; 
     return props.TryGetValue(key, out ex); 
    } 

Использование:

'Insert data at runtime' 
instance.AddDataExtension("Hello", "hi"); 

'Get the data at runtime' 
instance.GetDataExtension("Hello") 

Но я получаю эту ошибку:

The best overloaded method match for 'System.Runtime.CompilerServices.ConditionalWeakTable<object,System.Dynamic.ExpandoObject>.Add(object, System.Dynamic.ExpandoObject)' has some invalid arguments 

Я думаю, что неправильно использовал это свойство, этого можно достичь? если да, то как? Пожалуйста помоги.

Редактировать

вот полный класс:

public static class instance 
{ 
    private static readonly ConditionalWeakTable<object, ExpandoObject> props = new ConditionalWeakTable<object, ExpandoObject>(); 
     public static void AddDataExtension(this object key, dynamic value) 
     { 
      props.Add(key, value); 
     } 

     public static dynamic GetDataExtension(this object key) 
     { 
      ExpandoObject ex = null; 
      return props.TryGetValue(key, out ex); 
     } 
} 

То, что я хочу, чтобы достичь это:
я буду иметь случайные varialbes, например, "photo_01, photo_12, photo_15, name_01, name_02, age_01, age_02"
Если возможно Я хочу использовать метод таким образом:

id = <fetch from dbase> 
instance.AddDataExtension("photo_" + id, byte[]); 

А затем получить значение:

instance.GetDataExtension("photo_" + id) 
+0

Вы можете добавить больше информации о вашем проблема? Каков тип 'instance'? У вашего 'AddDataExtension' есть два аргумента, но вы вызываете его с помощью 3:' instance.AddDataExtension ("Hello", "hi") 'аргументы:' instance', '" Hello "', '" hi "' то же самое true для 'GetDataExtension'. И также неясно, чего вы пытаетесь достичь. – nemesv

+0

См. Мое редактирование. Надеюсь, я объясню это хорошо. спасибо – fiberOptics

+1

, что вы добавляете в словаре, не является ExpandoObject - вот почему вы получаете ошибку. И из ваших примеров не похоже, что вам нужен объект ExpandoObject вообще - вам просто нужен какой-либо объект (т. Е. System.Object). – Bond

ответ

0

Это не возможно, потому что ExpandoObject запечатан.

1

Я не вижу, что вы унаследовав от ExpandoObject так что вам, вероятно, нужно, чтобы сделать это. У ExpandoObject есть хорошая инфраструктура, которую можно использовать для создания динамического типа.

Вот статья, которая идет более подробно о создании динамических типов: http://www.codeproject.com/Articles/62839/Adventures-with-C-4-0-dynamic-ExpandoObject-Elasti

1

Использование conditionalWeakTable и динамики, вы могли бы реализовать динамические свойства расширения в несколько строк:

using System.Dynamic; 
using System.Runtime.CompilerServices; 

namespace ExtensionProperties 
{ 
    /// <summary> 
    /// Dynamically associates properies to a random object instance 
    /// </summary> 
    /// <example> 
    /// var jan = new Person("Jan"); 
    /// 
    /// jan.Age = 24; // regular property of the person object; 
    /// jan.DynamicProperties().NumberOfDrinkingBuddies = 27; // not originally scoped to the person object; 
    /// 
    /// if (jan.Age &lt; jan.DynamicProperties().NumberOfDrinkingBuddies = 27) 
    /// Console.WriteLine("Jan drinks too much"); 
    /// </example> 
    /// <remarks> 
    /// If you get 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create' you should reference Microsoft.CSharp 
    /// </remarks> 
    public static class ObjectExtensions 
    { 
     ///<summary>Stores extended data for objects</summary> 
     private static ConditionalWeakTable<object, object> extendedData = new ConditionalWeakTable<object, object>(); 

     /// <summary> 
     /// Gets a dynamic collection of properties associated with an object instance, 
     /// with a lifetime scoped to the lifetime of the object 
     /// </summary> 
     /// <param name="obj">The object the properties are associated with</param> 
     /// <returns>A dynamic collection of properties associated with an object instance.</returns> 
     public static dynamic DynamicProperties(this object obj) => extendedData.GetValue(obj, _ => new ExpandoObject()); 
    } 
} 

пример использования в XML-комментарии:

var jan = new Person("Jan"); 

jan.Age = 24; // regular property of the person object; 
jan.DynamicProperties().NumberOfDrinkingBuddies = 27; // not originally scoped to the person object; 

if (jan.Age && jan.DynamicProperties().NumberOfDrinkingBuddies == 27) 
{ 
    Console.WriteLine("Jan drinks too much"); 
}