使用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)
但是,上面的代码不支持静态属性.那么,如何创建支持静态属性和非静态属性的方法呢?
谢谢,
好吧,您可以通过以下方式捕获静态属性:
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您以后需要调用该函数的时间.根据你正在做的其他事情,这可能是也可能不是一个有用的想法:)
| 归档时间: |
|
| 查看次数: |
1013 次 |
| 最近记录: |