Vin*_*pin 6 c# lambda expression
我试图在从表达式创建查询时复制实体框架的行为,当我使用Attribute获取模型的属性时,我找到了使用ExpressionVisitor的方法
这是我到目前为止所得到的
internal class NVisitor : ExpressionVisitor
{
private readonly ParameterExpression _parameter;
private readonly Type _type;
public NVisitor(Type type)
{
_type = type;
_parameter = Expression.Parameter(type);
}
protected override Expression VisitParameter(ParameterExpression node)
{
return _parameter;
}
protected override Expression VisitMember(MemberExpression node)
{
if (node.Member.MemberType == MemberTypes.Property)
{
var memberName = node.Member.Name;
PropertyInfo otherMember = _type.GetProperty(memberName);
var ncols = node.Member.GetCustomAttributes(typeof(NColumn), true);
if (ncols.Any())
{
var ncol = (NColumn)ncols.First();
otherMember = _type.GetProperty(ncol.Name);
}
var inner = Visit(node.Expression);
return Expression.Property(inner, otherMember);
}
return base.VisitMember(node);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个属性NColumn,表示从表列的属性的真实名称,所以我按属性标记模型的属性
public class BonusTypeX
{
[NColumn("BonusTypeName")]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,当我试图得到表达,
[TestMethod]
public void ExpressionTesting2()
{
string searchKey = "Xmas";
Expression<Func<BonusTypeX, bool>> expression = x => x.Name.Contains(searchKey);
Type t = typeof(tbl_BonusType);
var body = new NVisitor(t).Visit(expression.Body);
string a = string.Join(".", body.ToString().Split('.').Skip(1));
Assert.AreEqual("BonusTypeName.Contains(\"Xmas\")", a);
}
Run Code Online (Sandbox Code Playgroud)
我懂了
BonusTypeName.Contains(值(Payroll.Test.Administration.TestRepositories + <> c__DisplayClass13).searchKey)
我期待得到的是
BonusTypeName.Contains( "圣诞节")
是否有任何方法获取表达式字符串?我在用
string a = string.Join(".", body.ToString().Split('.').Skip(1));
Run Code Online (Sandbox Code Playgroud)
我认为这可能是错误的.. :)
任何帮助,将不胜感激.
本地变量在运行时在编译器生成的类中捕获,这解释了该Payroll.Test.Administration.TestRepositories+<>c__DisplayClass13).searchKey部分.要在表达式中获取生成的字段值,必须在访问表达式时显式替换它的值:
protected override Expression VisitMember(MemberExpression node)
{
if (node.Member.MemberType == MemberTypes.Property)
{
var memberName = node.Member.Name;
PropertyInfo otherMember = _type.GetProperty(memberName);
var ncols = node.Member.GetCustomAttributes(typeof(NColumn), true);
if (ncols.Any())
{
var ncol = (NColumn)ncols.First();
otherMember = _type.GetProperty(ncol.Name);
}
var inner = Visit(node.Expression);
return Expression.Property(inner, otherMember);
}
if (node.Member.MemberType == MemberTypes.Field)
{
if (node.Expression is ConstantExpression)
{
var owner = ((ConstantExpression)node.Expression).Value;
var value = Expression.Constant(((FieldInfo)node.Member).GetValue(owner));
return value;
}
}
return base.VisitMember(node);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
193 次 |
| 最近记录: |