按类型限制部分lambda表达式

时间:2011-09-08 05:26:32

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

我想做这样的事情:

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!

请帮忙。

干杯

3 个答案:

答案 0 :(得分:1)

您可以使用OfType<T>()方法吗?

答案 1 :(得分:1)

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;
}

这是你想要的吗?

答案 2 :(得分:0)

你正在做的是......很奇怪,我不知道为什么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的签名的情况下),但也许我错过了一些东西。