我需要为类的非静态方法创建一个委托(delegate)。复杂的是,在创建时我没有类的实例,只有它的类定义。在通话时间,我手头有实例。因此,我需要一种方法:
这两种都有可能吗?如何?
注意:我愿意为 1 号支付高昂的性能价格,但理想情况下 2 号不应比代表调用贵很多。
最佳答案
您有两个选择,您可以像对待扩展方法一样对待它。创建一个委托(delegate)以接收对象和任何可选参数,并将这些参数传递给实际的函数调用。或者使用丹提到的 Delegate.CreateInstance
创建一个。
例如。,
string s = "foobar";
// "extension method" approach
Func<string, int, string> substring1 = (s, startIndex) => s.Substring(startIndex);
substring1(s, 1); // "oobar"
// using Delegate.CreateDelegate
var stype = typeof(string);
var mi = stype.GetMethod("Substring", new[] { typeof(int) });
var substring2 = (Func<string, int, string>)Delegate.CreateDelegate(typeof(Func<string, int, string>), mi);
substring2(s, 2); // "obar"
// it isn't even necessary to obtain the MethodInfo, the overload will determine
// the appropriate method from the delegate type and name (as done in example 2).
var substring3 = (Func<int, string>)Delegate.CreateDelegate(typeof(Func<int, string>), s, "Substring");
substring3(3); // "bar"
// for a static method
var compare = (Func<string, string, int>)Delegate.CreateDelegate(typeof(Func<string, string, int>), typeof(string), "Compare");
compare(s, "zoobar"); // -1
关于c# - 从非静态方法构建静态委托(delegate),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4083028/