我如何构建这个 C#“表达式”在运行时使用反射?
直到今天,我还没有找到一篇关于表达式的好文章 - 以及如何查看 C# lambda 语句并说“哦,那是废话”...所以,如果您知道一篇好文章,我将不胜感激这也是一个答案。
解释问题的代码示例
所以...给出以下 c# 代码:
public class SomeClass<T>
{
public TResult SomeMethod<TResult>(Expression<Func<T, TResult>> expression)
{
// This is just an example... don't get hung up on this :)
return default(TResult);
}
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
我如何
var blah = new SomeClass<Person>();
blah.SomeMethod(p => p.FirstName);
在运行时执行此操作(使用反射)?
我所期望的答案
我有点期待这样的东西......但我确信我对表达方式的选择还很遥远。
// By the way, these values are being passed to me... so you
// can't change this part of the question :)
Type personType = typeof(Person);
string propertyName = "FirstName";
// THIS CODE BELOW IS OBVIOUSLY WRONG, BUT YOU GET THE IDEA OF
// WHAT I HOPE TO DO... THIS LINE OF CODE BELOW IS **ALL** I'M
// ASKING HOW TO DO :)
var expression = Expression.MakeUnary(ExpressionType.Lambda,
Expression.Property(Expression.Parameter(personType, "p"),
propertyName), typeof(string));
blah.SomeMethod(expression);
To this day, I have not found a great article about expressions - and how to look at a C# lambda statement and say "oh, that's a blah blah"... so, if you know of a good article, I'd appreciate that as an answer too.
Code sample to explain the question
So... given the following c# code:
public class SomeClass<T>
{
public TResult SomeMethod<TResult>(Expression<Func<T, TResult>> expression)
{
// This is just an example... don't get hung up on this :)
return default(TResult);
}
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
How do I do this...
var blah = new SomeClass<Person>();
blah.SomeMethod(p => p.FirstName);
at runtime (using reflection)?
What I expect as an answer
I kinda expect something like this... but I'm sure I'm way off with my choice of expressions.
// By the way, these values are being passed to me... so you
// can't change this part of the question :)
Type personType = typeof(Person);
string propertyName = "FirstName";
// THIS CODE BELOW IS OBVIOUSLY WRONG, BUT YOU GET THE IDEA OF
// WHAT I HOPE TO DO... THIS LINE OF CODE BELOW IS **ALL** I'M
// ASKING HOW TO DO :)
var expression = Expression.MakeUnary(ExpressionType.Lambda,
Expression.Property(Expression.Parameter(personType, "p"),
propertyName), typeof(string));
blah.SomeMethod(expression);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
试试这个:
Try this:
ExpressionBuilder 是必经之路。
ExpressionBuilder is the way to go.