gpt4 book ai didi

c# - C#中使用反射制作动态LINQ语句

转载 作者:可可西里 更新时间:2023-11-01 08:16:58 27 4
gpt4 key购买 nike

如果我有一个像这样的 LINQ 语句

x = Table.SingleOrDefault(o => o.id == 1).o.name;

如何使用反射将传入的变量替换为“id”和“name”?当我尝试时,我不断收到对象引用未设置为对象错误的实例。我的尝试是这样的

x = (string)Table.SingleOrDefault(o => (int?)o.GetType().GetProperty(idString)
.GetValue(o, null) == 1).GetType().GetField(nameString).GetValue(x);

任何帮助都会很棒。谢谢。

最佳答案

您应该使用表达式树而不是反射。它的性能会更好,您将能够将它与 LINQ to Objects 和 LINQ to SQL/Entities 一起使用。

var source = new List<Test> { new Test { Id = 1, Name = "FirsT" }, new Test { Id = 2, Name = "Second" } };
var idName = "Id";
var idValue = 1;

var param = Expression.Parameter(typeof(Test));
var condition =
Expression.Lambda<Func<Test, bool>>(
Expression.Equal(
Expression.Property(param, idName),
Expression.Constant(idValue, typeof(int))
),
param
).Compile(); // for LINQ to SQl/Entities skip Compile() call

var item = source.SingleOrDefault(condition);

然后,您可以使用反射获取 Name 属性(您只需执行一次,因此使用反射就可以了。

var nameName = "Name";
var name = item == null ? null : (string) typeof(Test).GetProperty(nameName).GetValue(item);

Test 类定义为

public class Test
{
public int Id { get; set; }
public string Name { get; set; }
}

关于c# - C#中使用反射制作动态LINQ语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23814949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com