【问题标题】:C# Dynamic extends a objectC# 动态扩展一个对象
【发布时间】:2011-01-19 12:40:55
【问题描述】:

是否可以扩展现有对象?

我有密码

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
};

【问题讨论】:

  • record 是一个集合,而 object1 object2 是项目吗?或者 object1record 的一个属性?
  • record 是一个集合,object1 是另一个我将作为新属性添加到记录的对象
  • @Marco - 属性被命名;列表中的项目不是...
  • 我不是想在这里搞笑,其实很好奇你想在什么情况下这样做?
  • @Paddy - 要用作 ajax 调用的返回值,我会制作这个对象的 JSON,然后将其作为 actionresult 返回,但也许还有其他方法可以做到这一点

标签: c# reflection object dynamic


【解决方案1】:

简而言之,不。至少,不是匿名类型。这里有两种方法; dynamic 可能会给你你想要的,但是很适合组合。除此之外,一个基本的财产包——即使是简单的Dictionary&lt;string,object&gt; 也可以。唯一的区别是:

obj.id

变成

obj["id"]

但是,在尝试将 list(每个列表大部分都是匿名的)与 properties 合并时,还有一个更根本的问题。你可以做到这一点for data-binding purpose via custom property models,但它......很棘手。

【讨论】:

  • asp.net 中的 ViewState 和 Session 对象是属性包方法的经典示例。什么都可以进去,什么都可以出来,不需要复杂的语法。
【解决方案2】:

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

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”扩展方法。

【讨论】:

    【解决方案3】:

    如果将来有人遇到这个问题,我最近发布了一个库来解决这个问题。您可以在 nuget.org 上找到它 - 它被称为(毫不奇怪)ObjectExtend。

    您可以通过从Nuget 获取它或通过您最喜欢的包管理器来安装它。您还可以查看source codebrief introductiondetailed overview of how it works

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

    警告:这是一种很好的探索性编码技术,但我建议不要将它用于任何将被维护或投入生产的东西。

    【讨论】:

      【解决方案4】:

      从 .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);
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 2011-09-21
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多