c# - 如何获取具有动态绑定(bind)目标的实例方法的方法引用

标签 c# c#-4.0 lambda delegates

在C#中,我们可以通过静态方法或实例方法的方法引用来实例化Delegate。示例:

Func<object, object, bool> refEquals = Object.ReferenceEquals;  // target = null
Func<string> toStr = new Object().ToString; // target = new Object()

对于后者,委托(delegate)的目标是 new Object() ,而前者有 null目标。

但是,我如何实例化 ToString 的委托(delegate)没有预定义的方法引用 target ?在这种情况下,我希望 ToString的目标将与委托(delegate)的论点绑定(bind)。这可能很有用,例如,对 IEnumerable<T> 的所有项目调用某个实例方法。 :

Func<object, string> toStr = Object.ToString; // the target (this) would be the Func’s argument
IEnumerable<T> dataSrc = ...
IEnumerable<String> dataSrc = dataSrc.Select(toStr);

但是,第一行无法编译:

error CS0123: No overload for 'ToString' matches delegate 'System.Func'

Java 8 通过 Reference to an Instance Method of an Arbitrary Object 提供此功能。如何在 .Net 中实现同样的功能?


我知道我们可以使用 lambda 表达式来超越这个限制,例如:

 Func<Object, String> toStr = item => item.ToString();

但是,这会导致进一步间接调用 ToString实例方法,因此我不认为此解决方法是解决我的问题的有效解决方案。

最佳答案

通过反射,您可以获得与 Java 8 中描述的行为等效的行为。您可以创建一个具有 null 目标的 Delegate 实例,并动态绑定(bind)其this 方法参数的第一个参数。对于您的示例,您可以通过以下方式创建 toStr 委托(delegate):

MethodInfo methodToStr = typeof(object).GetMethod("ToString");
Func<Object, String> toStr = (Func<Object, String>) Delegate.CreateDelegate(
            typeof(Func<Object, String>),
            methodToStr);

关于c# - 如何获取具有动态绑定(bind)目标的实例方法的方法引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37525900/

相关文章:

c# - 如何使用 Moq 验证字符串数组中的值是否已设置

C# 最小有效数字数

c# - 如何计算 Nullable<T> 数据类型的大小

python - 从一个范围中获取两个值

c# - 来自 Func<> 的异常未被捕获(异步)

c# - 为什么没有人为 Winforms 编写 RadioMenuItems 类?

c# - 删除实体类属性时 MongoDb.Driver 抛出异常

c# - 关于IEqualityComparer<T>/List<T>.Distinct()的问题

c# - Excel Addin 中的 Application.ActiveWorkbook 为空

java - iterable.forEach() 和 iterable.stream().forEach() 的区别