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

Sou*_*ter 4 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);
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

Jon*_*eet 7

好吧,您可以通过以下方式捕获静态属性:

CaptureProperty<string, Encoding>(x => Encoding.UTF8);
Run Code Online (Sandbox Code Playgroud)

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

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

void CaptureProperty<T>(Func<T> func)
{
    // Whatever
}
Run Code Online (Sandbox Code Playgroud)

用法是这样的:

CaptureProperty<Encoding>(() => Encoding.UTF8);
Run Code Online (Sandbox Code Playgroud)

这就是你要追求的吗?

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

void CaptureProperty<T>(Func<T> func)
{
    CaptureProperty<DummyType, T>(x => func());
}
Run Code Online (Sandbox Code Playgroud)

然后您可以检测到"源"类型是DummyType您以后需要调用该函数的时间.根据你正在做的其他事情,这可能是也可能不是一个有用的想法:)