ero*_*ebe 12 c# linq reflection
如果我有一个像LINQ这样的语句
x = Table.SingleOrDefault(o => o.id == 1).o.name;
Run Code Online (Sandbox Code Playgroud)
如何使用反射传入变量替换"id"和"name"?我尝试时不断将对象引用设置为对象错误的实例.我的尝试就是这样的
x = (string)Table.SingleOrDefault(o => (int?)o.GetType().GetProperty(idString)
.GetValue(o, null) == 1).GetType().GetField(nameString).GetValue(x);
Run Code Online (Sandbox Code Playgroud)
任何帮助都会很棒.谢谢.
Mar*_*zek 27
您应该使用表达式树而不是反射.它将表现更好,并且您将能够将它与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);
Run Code Online (Sandbox Code Playgroud)
然后,你可以Name使用反射获得属性(你只需要做一次,所以使用反射来做它很好.
var nameName = "Name";
var name = item == null ? null : (string) typeof(Test).GetProperty(nameName).GetValue(item);
Run Code Online (Sandbox Code Playgroud)
Test class定义为
public class Test
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)