我需要为类的非静态方法创建一个委托(delegate)。复杂的是,在创建时我没有类的实例,只有它的类定义。在通话时间,我手头有实例。因此,我需要一种方法:

  • 构建一个“不完整”的委托(delegate)给成员方法,缺少实例。
  • 从 1 调用委托(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/

    10-14 22:21