gpt4 book ai didi

c# - 在 C# 中传递成员函数

转载 作者:可可西里 更新时间:2023-11-01 07:42:54 24 4
gpt4 key购买 nike

大多数情况下,C# 委托(delegate)已经将对象与成员函数存储在一起,这很方便。但是有没有一种方法可以仅存储成员函数本身并将其作为参数传递,就像 C++ 中古老的指向成员函数的指针一样?

如果描述不够清楚,我会给出一个独立的例子。而且,是的,在示例中坚持传递成员函数是完全没有意义的,但我对此有更重要的用途。

class Foo {
public int i { get; set; }
/* Can this be done?
public static int Apply (Foo obj, ???? method, int j) {
return obj.method (j);
}
*/
public static int ApplyHack (Foo obj, Func<int, int> method, int j) {
return (int) method.Method.Invoke (obj, new object [] { j });
}
public static readonly Foo _ = new Foo (); // dummy object for ApplyHack

public int Multiply (int j) {
return i * j;
}
public int Add (int j) {
return i + j;
}
}
class Program {
static void Main (string [] args) {
var foo = new Foo { i = 7 };
Console.Write ("{0}\n", Foo.ApplyHack (foo, Foo._.Multiply, 5));
Console.Write ("{0}\n", Foo.ApplyHack (foo, Foo._.Add, 5));
Console.ReadKey ();
}
}

你看,我发现的唯一解决方法相当丑陋,而且可能很慢。

最佳答案

你想要的是一个叫做 open instance delegate 的东西.我写过关于他们的文章 on my blog

基本上,您可以创建实例方法的委托(delegate),而无需将其绑定(bind)到特定实例,并在调用它时指定要在其上使用它的实例:

class Foo {
public int i { get; set; }

public int Multiply (int j) {
return i * j;
}
public int Add (int j) {
return i + j;
}
}
class Program {
static void Main (string [] args) {
Func<Foo, int, int> multiply = (Func<Foo, int, int>)Delegate.CreateDelegate(typeof(Func<Foo, int, int>), null, typeof(Foo).GetMethod("Multiply");
Func<Foo, int, int> add = (Func<Foo, int, int>)Delegate.CreateDelegate(typeof(Func<Foo, int, int>), null, typeof(Foo).GetMethod("Add");

var foo1 = new Foo { i = 7 };
var foo2 = new Foo { i = 8 };

Console.Write ("{0}\n", multiply(foo1, 5));
Console.Write ("{0}\n", add(foo1, 5));
Console.Write ("{0}\n", multiply(foo2, 5));
Console.Write ("{0}\n", add(foo2, 5));
Console.ReadKey ();
}
}

关于c# - 在 C# 中传递成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com