【问题标题】:Restrict part of the lambda expression by type按类型限制 lambda 表达式的一部分
【发布时间】:2011-09-08 05:26:31
【问题描述】:

我想做这样的事情:

public string DoSomething(Expression<Func<int>> expression)
{
    //...
}

public void CallDoSomething()
{
    var myObj = new MyType();
    var result = DoSomething(() => myObj.IntProperty);
}

目标是在“DoSomething()”中做这三件事: 1) 获取对 myObj 的引用并对其进行处理 2) 获取属性“IntProperty”的名称和值 3) 将 myObj 限制为仅 MyType 类型

我可以做 1 和 2,但我不知道如何做 3!

请帮忙。

干杯

【问题讨论】:

  • 我还没有找到解决方案,但现在我只是向 DoSomething 添加一行代码,它基本上说 if (myObj.GetType() != typeof(MyType))...

标签: c# linq lambda linq-to-objects


【解决方案1】:

你可以使用OfType&lt;T&gt;()方法吗?

【讨论】:

  • 不能没有 IEnumerable
【解决方案2】:
public static string DoSomething(Expression<Func<int>> expression) 
{
    MemberExpression memberExpression = (MemberExpression)expression.Body;
    Type type = memberExpression.Member.ReflectedType; // MyType

    bool check = typeof(MyType).IsAssignableFrom(type); // So you could check for base class
    // If you want to check for exactly one class, do 
    // bool type == typeof(MyType);

    if (!check) 
    {
        throw new Exception();
    }

    return null;
}

这是你想要的吗?

【讨论】:

  • 这是我已经在使用的解决方案,但我认为您处理检查的能力比我做得更好(我使用了 .GetType() ==)。我想要的是一种允许安全地检查编译时间的方法。
【解决方案3】:

你正在做的是......奇怪,我不知道为什么 GetType 解决方案不可接受,但你可能可以通过另一层实现类似的东西:

public string DoSomething(Expression<Func<int>> expression)
{
    //...
}

public void CallDoSomething()
{
    var myObj = new MyType();
    var result = CallHelper(myObj);
}

private string CallHelper(MyType m)
{
    return DoSomething(() => m.IntProperty);
}

CallHelper 为您强制执行类型限制。我认为没有任何方法可以直接在 lambda 表达式中执行此操作(至少在不更改 DoSomething 签名的情况下不会),但也许我遗漏了一些东西。

【讨论】:

  • 更改 DoSomething 的签名是完全可以的。但我只是不确定如何仅通过更改签名来解决这个特定问题。
  • 也许 DoSomething(T obj, Expression> exp) 其中 T : MyType {}。调用看起来像 DoSomething(myObj, () => myObj.IntProperty);缺点是 lambda 表达式是基于 MyType 的,甚至与第一个参数是同一个对象。
猜你喜欢
  • 1970-01-01
  • 2018-01-26
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 2013-07-02
相关资源
最近更新 更多