2011-01-19 75 views
4

是否可以扩展现有对象?C#Dynamic扩展对象

我的代码

var record = new 
{ 
    id, 
    name 
}; 

,并有匿名对象

var list = new List<object>(){ object1, object2 }; 

我后面将它们添加到该对象的名单? 喜欢的东西作为

foreach (var o in list) 
{ 
    record.add(o); 
} 

,我会得到这样的结果

var record = new 
{ 
    id, 
    name, 
    object1, 
    object2 
}; 
+2

是*记录*集合和* object1 object2 *是项目吗?或* object1 *是* record *的属性? – 2011-01-19 12:47:38

+0

记录是一个集合,而object1是另一个对象,我将添加为一个新的属性来记录 – Marco 2011-01-19 12:51:48

+0

@Marco - 属性* *名称*;在列表中的项目*不是* ... – 2011-01-19 12:55:18

回答

2

总之,没有。至少,不是匿名类型。这里有两种方法。 dynamic可能会给你你想要的东西,但很容易组合。除此之外,一个基本的财产袋 - 即使只是Dictionary<string,object>会做。唯一的区别在于:

obj.id 

成为

obj["id"] 

还有一个更根本的问题,不过,在尝试将列表(每个很大程度上是匿名的)与性质结合在一个单一的步骤。你可以做这个for data-binding purpose via custom property models,但它是...棘手。

0

由于.net4,你可以使用ExpandoObject做类似的东西。

例如:

 var objs = new List<ExpandoObject>(); 

     for (var i = 0; i < 10; i++) 
     { 
      dynamic eObj = new ExpandoObject(); 
      eObj.Property = i; 
      objs.Add(eObj); 
     } 

     foreach (dynamic obj in objs) 
     { 
      obj.Property2 = "bubuValue" + obj.Property; 
      obj.Property3 = "bubuValue" + obj.Property2; 
     } 

     foreach (dynamic obj in objs) 
     { 
      Console.WriteLine(obj.Property3); 
     } 
1

你可以做的就是创建一个类扩展。这是不可能在运行时添加新的方法,但你可以做这样的事情:

public class OneClass 
{ 
    private List<object> items; 
    public List<object> Items { get { return items; } } 
    public void AddOne(object item) 
    { 
    items.Add(item); 
    } 
} 

,如果你想扩展这个类的行为,你可以写一个扩展类。就像这样:

public static class OneClassExtensions 
{ 
    public void AddMany(this OneClass self, params object[] items) 
    { 
    foreach(object item in items) 
    { 
     self.Items.Add(item); 
    } 
    } 
} 

这样你可以从你的OneClass对象调用此扩展方法:

OneClass obj = new OneClass(); 
obj.AddOne("hello"); 
obj.AddMany("Hello", "world"); // Extension method 

有一些规律可循:

  1. 扩展类必须有`静态'修饰符
  2. 您需要在第一个参数前加上`this'前缀。这个论点本身就是对象。
  3. 为了在您的代码中使用此扩展类,您必须使用包含该扩展类的名称空间,例如在要使用的每个.cs文件中使用“Some.Namespace.That.Has.An.Extension”扩展方法。