C# 如何使用LINQ向对象动态添加属性
我有一个C# 如何使用LINQ向对象动态添加属性,c#,linq,C#,Linq,我有一个查询表和一个列表。我已经能够映射哪些书籍与使用LINQ的作者相关 我想使用条的值并动态地将属性添加到Foo对象,如下所示,显然将类型更改为对象或动态 对于LINQ,这可能吗?如果可能,我怎么做 示例所需结果(最终解析为JSON) 示例类 public class Foo { public int Id { get; set; } public string Name { get; set; } } public class Bar { public string
查询表
和一个列表
。我已经能够映射哪些书籍与使用LINQ的作者相关
我想使用条的值
并动态地将属性添加到Foo
对象,如下所示,显然将类型更改为对象
或动态
对于LINQ,这可能吗?如果可能,我怎么做
示例所需结果(最终解析为JSON)
示例类
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Bar
{
public string Title { get; set; }
public int Count { get; set; }
}
不能向类动态添加属性。我想有几种方法可以让你得到想要的结果 最简单的方法是将您的类修改为
public class Author
{
public int Id { get; set; }
public string Name { get; set; }
public List<Book> AuthorBooks { get; set; }
}
public class Book
{
public string Title { get; set; }
public string Isbn { get; set; }
}
JsonSerializer来自Newtonsoft.Json您尝试过使用匿名类型吗
var foos = new List<Foo>{
new Foo{Id = 1, Name = "Grapes of Wrath"},
new Foo{Id = 2, Name = "Shantaram"}
};
var anonObject = from f in foos
select new
{
Id = f.Id,
Name = f.Name,
Garden = 6
};
var serialized = JsonConvert.SerializeObject(anonObject);
return serialized; //[{"Id":1,"Name":"Grapes of Wrath","Garden":6},
//{"Id":2,"Name":"Shantaram","Garden":6}]
var foos=新列表{
新Foo{Id=1,Name=“愤怒的葡萄”},
新Foo{Id=2,Name=“Shantaram”}
};
var anonObject=来自foos中的f
选择新的
{
Id=f.Id,
Name=f.Name,
花园=6
};
var serialized=JsonConvert.serialized对象(anonObject);
返回序列化//[{“Id”:1,“Name”:“愤怒的葡萄”,“花园”:6},
//{“Id”:2,“Name”:“Shantaram”,“Garden”:6}]
请注意,匿名类型不能跨越函数边界,因此必须在同一个函数中创建动态属性并序列化
或者,您也可以这样创建新类型:
public class FooBar
{
public Foo Foo { get; set; }
public List<Bar> Bars { get; set; }
}
公共类FooBar
{
公共Foo Foo{get;set;}
公共列表栏{get;set;}
}
这个家伙可以到处移动,拥有你需要的所有属性,不需要每次更改Foo或Bar时都进行更改,并且可以干净地序列化。我的问题的解决方案是使用OData4中的“开放类型”解决的,使用的是动态属性
public IDictionary<string, object> DynamicProperties { get; set; }
公共IDictionary动态属性{get;set;}
通过创建DynamicProperties属性,我可以设置并获取我试图通过LINQ动态添加的成员
因为我没有通过LINQ解决这个问题,所以我不会选择我的答案作为公认的答案,但我认为它可能对未来的人们有用。如果有人使用LINQ发布解决原始问题的答案,我将接受。如果您希望动态地向对象添加属性,这可能是一个解决方案 这对我来说是有效的,我也有一个顾虑,就是那些具有许多属性的域对象发生了什么,对象中任何更改的可维护性都是荒谬的,我设法用LINQ-ExpandObject-Reflection构建了一个实现,这有助于保持对象的动态性,并且只添加视图逻辑所需的附加属性
var expandedModel = FooList.Select(x =>
{
dynamic expandObject = new ExpandoObject();
expandObject.NewProperty= $"PropertyValue";
foreach (var property in x.GetType().GetProperties())
{
((IDictionary<string, object>)expandObject).Add(property.Name, property.GetValue(x));
}
return expandObject;
}).ToList();
var expandedModel=doulist.Select(x=>
{
动态expandObject=新的ExpandooObject();
expandObject.NewProperty=$“PropertyValue”;
foreach(x.GetType().GetProperties()中的var属性)
{
((IDictionary)expandObject).Add(property.Name,property.GetValue(x));
}
返回对象;
}).ToList();
作者和书的关系在哪里?另外,json结果的结构非常奇怪,使用起来不太舒服。我建议使用书籍数组。为什么不使用书籍数组而不是每本书的属性呢?我同意Sergey的观点,但是我也不明白你所说的“动态向作者对象添加属性”是什么意思。你的意思是扩展C#Author
类,还是向JSON对象添加属性?似乎你可以搜索类似“ExpandoObject to JSON”的内容。我在这里的回答中提到了如何添加属性:当然,在执行任何linq转换时都可以使用这些属性。ExpandObject看起来可以工作。你有什么例子可以说明如何做到这一点吗?--我喜欢这样,我认为它可能在正确的轨道上,但是“Foo”有很多属性会随着时间的推移而改变。我不想每次都要在select中添加每个新字段。此外,在同一方法中序列化不是一个好方法option@JacobVoller如果类型需要存在于应用程序的不同部分中,那么您可能需要咬紧牙关创建类。如果这个“动态”类需要与Foo或Bar相同的属性,那么只需从它们继承,否?类型不需要存在于应用程序的不同部分中,属性/字段只需要位于对象上-可以是dynamic@JacobVoller在这种情况下,您可能需要考虑将匿名类型返回为Stask.Objor。它具有属性,并且可以被发现,这就是JsonConvert所做的。出于维护原因,通常首选强类型,但动态类型在这方面并不比System.Object强。@JacobVoller我编辑了我的答案,因为听起来你在努力避免创建新类型,但我同意其他评论者的观点,即新类是最干净的解决方案。
public IDictionary<string, object> DynamicProperties { get; set; }
var expandedModel = FooList.Select(x =>
{
dynamic expandObject = new ExpandoObject();
expandObject.NewProperty= $"PropertyValue";
foreach (var property in x.GetType().GetProperties())
{
((IDictionary<string, object>)expandObject).Add(property.Name, property.GetValue(x));
}
return expandObject;
}).ToList();