在许多假设情景中,拉布达斯是巨大的,但如果你不想要他们,也许根本不使用他们? 我怀着仇恨说,但只是尝试和测试简单的扼杀,特别是在数据具有约束力的假设情景下。 如果你希望快速进入,你可以看望超稿人,或者有办法将一名代表汇编到财产存取人手中,或者你可以建立“<>Expression,从该编码中提取并加以汇编(包括<条码>目标代码>的投稿)。 如果你想要一个已知的签字,而不是打上(速度较慢的)<代码>DynamicInvoke。
当然,在大多数情况下,即便是粗略的反射也足够快,并且是瓶颈。
我建议从最简单的法典开始,并检查它是否真正是 /em>,然后太慢,而担心它会很快。 如果太慢,不会改变。 以上任何一种选择都将在其他方面发挥作用。
另一种想法是,如果你使用<代码>Expression,你可以做这样的事情:
public void IncludeProperties<T>(
Expression<Func<T,object>> selectedProperties)
{
// some logic to store parameter
}
IncludeProperties<IUser>( u => new { u.ID, u.LogOnName, u.HashedPassword });
之后,该表述是分开的? 至少......此处有显示拆除的样本代码:
public static void IncludeProperties<T>(
Expression<Func<T, object>> selectedProperties)
{
NewExpression ne = selectedProperties.Body as NewExpression;
if (ne == null) throw new InvalidOperationException(
"Object constructor expected");
foreach (Expression arg in ne.Arguments)
{
MemberExpression me = arg as MemberExpression;
if (me == null || me.Expression != selectedProperties.Parameters[0])
throw new InvalidOperationException(
"Object constructor argument should be a direct member");
Console.WriteLine("Accessing: " + me.Member.Name);
}
}
static void Main()
{
IncludeProperties<IUser>(u => new { u.ID, u.LogOnName, u.HashedPassword });
}
一旦你知道 MembersInfo
s(me. Members
in the above),你自己为个人进入而建造的拉姆布达应当是三角的。 例如(包括一个编号为的
的条目,以获得单一签名):
var param = Expression.Parameter(typeof(T), "x");
var memberAccess = Expression.MakeMemberAccess(param, me.Member);
var body = Expression.Convert(memberAccess, typeof(object));
var lambda = Expression.Lambda<Func<T, object>>(body, param);
var func = lambda.Compile();