使用 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);
但是,上面的代码不支持静态属性。那么,如何创建同时支持静态属性和非静态属性的方法呢?
谢谢,
最佳答案
好吧,您可以通过这种方式捕获静态属性:
CaptureProperty<string, Encoding>(x => Encoding.UTF8);
然后,您需要在执行时提供一个“虚拟”值......
另一种方法是提供另一个只有一个类型参数的重载:
void CaptureProperty<T>(Func<T> func)
{
// Whatever
}
使用是这样的:
CaptureProperty<Encoding>(() => Encoding.UTF8);
这就是你所追求的吗?
如果你想在内部统一这两者,你可以在与
CaptureProperty
相同的类型中拥有一个“虚拟”私有(private)嵌套类型。并像这样实现静态版本:void CaptureProperty<T>(Func<T> func)
{
CaptureProperty<DummyType, T>(x => func());
}
然后你可以检测到“源”类型是
DummyType
当您需要稍后调用该函数时。这可能是一个有用的想法,也可能不是一个有用的想法,这取决于你在做什么:)
关于lambda - 如何使用 lambda 表达式捕获静态或非静态属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1939168/