我不会说这是必不可少的。但是在您真正需要它的极少数情况下,它非常有用。
举个例子。
最近,我不得不创建一些代码,这些代码可以在运行时为以下代码创建表达式树,但在编译时却不知道依赖属性的名称:
Expression<Func<TMock, TDependency>> expression = (x => x.Dependency);
为了动态设置一个模拟(使用Moq框架)。
mock.Setup(expression).Returns(dependency);
我所做的是我使用具体类型编译了原始表达式,然后使用了反射器,发现我必须编写以下代码:
var argument = Expression.Parameter(typeof(TMock), "x");
var getPropertyExpression = Expression.Property(argument, propertyInfo.Name);
var lambda = Expression.Lambda<Func<TMock, TDependency>>(getPropertyExpression, argument);
Expression<Func<TMock, TDependency>> expression = lambda;
我本可以通过反复试验弄清楚这一点。但是反射器使它变得容易。