是否可以扩展现有对象?
我有代码
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
};
答案 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
有一些规则要遵循:
答案 2 :(得分:1)
万一将来有人遇到这个问题,我最近发布了一个库来做这个。您可以在nuget.org上找到它-它被称为(毫无疑问)ObjectExtend。
您可以通过从Nuget抓取它或通过您喜欢的软件包管理器来安装它。您还可以检出source code,brief introduction或detailed 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);
}