C#Dynamic扩展了一个对象

时间:2011-01-19 12:40:56

标签: c# reflection object 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
};

4 个答案:

答案 0 :(得分:2)

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

obj.id

变为

obj["id"]

但是,在尝试将列表(每个都基本上是匿名的)与属性组合在一起时,存在一个更基本的问题。 可以执行此操作for data-binding purpose via custom property models,但这很棘手。

答案 1 :(得分:1)

您可以做的是创建一个类Extension。无法在运行时添加新方法,但您可以执行以下操作:

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. 扩展类必须具有“static”修饰符
  2. 你需要在第一个参数之前加上'this'前缀。这个论点就是对象本身。
  3. 为了在代码中使用此扩展类,必须使用包含该扩展类的命名空间,例如在要使用的每个.cs文件中使用`using Some.Namespace.That.Has.An.Extension'扩展方法。

答案 2 :(得分:1)

万一将来有人遇到这个问题,我最近发布了一个库来做这个。您可以在nuget.org上找到它-它被称为(毫无疑问)ObjectExtend。

您可以通过从Nuget抓取它或通过您喜欢的软件包管理器来安装它。您还可以检出source codebrief introductiondetailed overview of how it works

简短的版本是-安装软件包,确保使用using Rophuine.LINQPad.ObjectExtend;导入名称空间,现在您应该可以在对象上调用.Extend

一个警告:这是一种探索性编码的好技术,但是我建议不要将其保留或投入生产。

答案 3 :(得分: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);
        }