C# 如何获取具有动态绑定目标的实例方法的方法引用

C# 如何获取具有动态绑定目标的实例方法的方法引用,c#,c#-4.0,lambda,delegates,C#,C# 4.0,Lambda,Delegates,在C#中,我们可以通过对静态方法或实例方法的方法引用来实例化委托。例如: Func<object, object, bool> refEquals = Object.ReferenceEquals; // target = null Func<string> toStr = new Object().ToString; // target = new Object() 但是,第一行不编译: 错误CS0123:“ToString”没有重载与委托“System.Func”

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

Func<object, object, bool> refEquals = Object.ReferenceEquals;  // target = null
Func<string> toStr = new Object().ToString; // target = new Object()
但是,第一行不编译:

错误CS0123:“ToString”没有重载与委托“System.Func”匹配

Java8通过以下方式提供此功能。如何在.Net中实现相同的功能


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

 Func<Object, String> toStr = item => item.ToString();
Func-toStr=item=>item.ToString();
但是,这会导致调用
ToString
实例方法的进一步间接操作,因此我不认为此解决方法是解决我问题的有效方法。

通过反射,您可以获得与Java 8中描述的行为相同的行为。您可以创建具有
null
目标的委托实例,并将其第一个参数动态绑定到
this
方法参数。例如,您可以通过以下方式创建
toStr
委托:

MethodInfo methodToStr = typeof(object).GetMethod("ToString");
Func<Object, String> toStr = (Func<Object, String>) Delegate.CreateDelegate(
            typeof(Func<Object, String>),
            methodToStr);
MethodInfo methodToStr=typeof(object).GetMethod(“ToString”);
Func toStr=(Func)Delegate.CreateDelegate(
类型(Func),
方法:随机分组;

我不懂java,但在
C
中,如果需要,必须将对象的实例传递给委托。从未听说过任意物体或类似的东西。使用反射(使用
StackFrame
)可以获得方法名等,但不多,这将是lambda(您正试图避免)。我认为真正的答案是,“在c#中,如果没有lambda或helper方法,您就不能”。虽然这已经很接近了,但在一般情况下存在
含糊不清的MatchException
的风险。@Tewr您可能会在委托实例化时得到该异常。
MethodInfo methodToStr = typeof(object).GetMethod("ToString");
Func<Object, String> toStr = (Func<Object, String>) Delegate.CreateDelegate(
            typeof(Func<Object, String>),
            methodToStr);