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

标签 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);

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

谢谢,

最佳答案

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

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/

相关文章:

selenium - pagefactory 在 C# 中显式等待 Web 元素的集合

c# - 空指针测试性能

c# - 如何在 LINQ Where() 中使用额外的 int 参数

java - 匿名类替换为 lambda 表达式

java - Java 8 lambda 表达式的问题

c# - AutoMapper TypeConverter 将可空类型映射到不可空类型

c#-4.0 - 我想使用 WebGrid 将自由格式的 native 查询输出发送到 excel

java - JMonkeyEngine 与 JDK 8

java - 如何使用 Java 8 streaming api 从 map 列表创建 map map

linq-to-sql - Linq 到 SQL : Left joining a grouped set makes a Cross Apply/Outer Apply