如何使用lambda表达式捕获静态或非静态属性?

时间:2009-12-21 09:45:22

标签: lambda c#-4.0

使用lambda表达式捕获某些类的属性或方法有很多好处,如下面的代码。

void CaptureProperty<T, TProperty> (Func<T, TProperty> exp)
{
   // some logic to keep exp variable
}

// So you can use below code to call above method.
CaptureProperty<string, int>(x => x.Length);

但是,上面的代码不支持静态属性。那么,如何创建支持静态属性和非静态属性的方法呢?

谢谢,

1 个答案:

答案 0 :(得分:7)

嗯,你可以捕获一个静态属性:

CaptureProperty<string, Encoding>(x => Encoding.UTF8);

然后,您需要在执行时提供“虚拟”值...

另一种方法是提供另一个只有一个类型参数的重载:

void CaptureProperty<T>(Func<T> func)
{
    // Whatever
}

使用方式如下:

CaptureProperty<Encoding>(() => Encoding.UTF8);

这就是你要追求的吗?

如果你想在内部统一这两个,你可以在与CaptureProperty相同的类型中拥有一个“虚拟”私有嵌套类型,并实现这样的静态版本:

void CaptureProperty<T>(Func<T> func)
{
    CaptureProperty<DummyType, T>(x => func());
}

然后,当您需要稍后调用该函数时,您可以检测到“source”类型为DummyType。根据您正在做的其他事情,这可能是也可能不是一个有用的想法:)