English 中文(简体)
C#中界定和获取选定特性的最佳方式是什么?
原标题:What s the best way to define & access selected properties in C#?
  • 时间:2009-10-18 17:20:38
  •  标签:

my recent question,我试图将这个领域集中起来,将一些sil逻辑纳入域界面。 然而,我发现一些问题需要包括或排除某些财产无效。

基本上,我可以像以下法典那样使用表达树。 然而,我不喜欢这样做,因为我需要每当我发表《玛尔巴达宣言》时确定当地变量(“u”)。 是否有任何来源法比我短? 此外,我还需要一些方法,迅速接触选定的财产。

public void IncludeProperties<T>(params Expression<Func<IUser,object>>[] selectedProperties)
{
    // some logic to store parameter   
}

IncludeProperties<IUser>
(
    u => u.ID,
    u => u.LogOnName,
    u => u.HashedPassword
);

<>Thanks,

最佳回答

在许多假设情景中,拉布达斯是巨大的,但如果你不想要他们,也许根本不使用他们? 我怀着仇恨说,但只是尝试和测试简单的扼杀,特别是在数据具有约束力的假设情景下。 如果你希望快速进入,你可以看望超稿人,或者有办法将一名代表汇编到财产存取人手中,或者你可以建立“<>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 });
}

一旦你知道 MembersInfos(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();
问题回答

这里我最简短的表述是:

public static void IncludeProperties(Expression<Action<IUser>> selectedProperties)
{
    // some logic to store parameter   
}

public static void S(params object[] props)
{
    // dummy method to get to the params syntax
}

[Test]
public void ParamsTest()
{
    IncludeProperties(u => S(
        u.Id,
        u.Name
        ));

}




相关问题