使用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);
但是,上面的代码不支持静态属性。那么,如何创建支持静态属性和非静态属性的方法呢?
谢谢,
答案 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
。根据您正在做的其他事情,这可能是也可能不是一个有用的想法:)