Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ向对象动态添加属性_C#_Linq - Fatal编程技术网

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();