【问题标题】:Is it possible to send an Object's Method to a Function?是否可以将对象的方法发送给函数?
【发布时间】:2010-11-22 15:18:10
【问题描述】:

我想知道是否可以(以及语法是什么)将对象的方法发送给函数。

例子:

Object "myObject" has two methods "method1" and "method2"

我想有一个类似的功能:

public bool myFunc(var methodOnObject)
{
   [code here]
   var returnVal = [run methodOnObject here]
   [code here]
   return returnVal;
}

这样我就可以在另一个函数中执行类似的操作

public void overallFunction()
{
   var myObject = new ObjectItem();
   var method1Success = myFunc(myObject.method1);
   var method2Success = myFunc(myObject.method2);
}

【问题讨论】:

  • 德尔盖茨应该能解决你的问题

标签: c# .net function methods


【解决方案1】:

是的,您需要使用委托。委托非常类似于 C/C++ 中的函数指针。

您首先需要声明委托的签名。假设我有这个功能:

private int DoSomething(string data)
{
    return -1;
}

委托声明将是...

public delegate int MyDelegate(string data);

然后你可以用这种方式声明 myFunc..

public bool myFunc(MyDelegate methodOnObject)
{
    [code here]
    int returnValue = methodOnObject("foo");
    [code here]
    return returnValue;
}

然后您可以通过以下两种方式之一调用它:

myFunc(new MyDelegate(DoSomething));

或者,在 C# 3.0 及更高版本中,您可以使用...的简写形式

myFunc(DoSomething); 

(它只是自动将提供的函数包装在该委托的默认构造函数中。调用在功能上是相同的)。

如果您不关心为简单表达式实际创建委托或实际函数实现,则以下内容也适用于 C# 3.0:

public bool myFunc(Func<string, int> expr)
{
    [code here]
    int returnValue = methodOnObject("foo");
    [code here]
    return returnValue;
}

然后可以这样调用:

myFunc(s => return -1);

【讨论】:

  • C# 3.5 还允许您避免声明自己的委托类型,就像您可以使用 Func&lt;string, int&gt; 一样,它表示与您的 MyDelegate 类型相同的签名。
  • @Simon:在某些情况下,是的,有一些内置的委托类型,并且 3.5 确实添加了几个可能有用的作为 LINQ 支持包的一部分。话虽如此,能够声明委托是 IMO,任何 .NET 开发人员都应该能够做到的事情。
  • 很好的答案,感谢您提供所有信息和详细信息。投票赞成,但使用其他作为官方答案,因为它直接使用了我的示例。有时希望有 2 个被接受的答案,因为您的两个答案结合在一起可以提供任何人可能想要的这个问题的所有详细信息。再次感谢!
【解决方案2】:

真的需要明确的委托吗?也许这种方法会对您有所帮助:

private class MyObject
{
    public bool Method1() { return true; } // Your own logic here
    public bool Method2() { return false; } // Your own logic here
}

private static bool MyFunction(Func<bool> methodOnObject)
{
    bool returnValue = methodOnObject();
    return returnValue;
}    

private static void OverallFunction()
{
    MyObject myObject = new MyObject();

    bool method1Success = MyFunction(myObject.Method1);
    bool method2Success = MyFunction(myObject.Method2);
}

【讨论】:

  • 不确定这是否是一个错字...Func&lt;...&gt; 非常 delegate
  • 抱歉删除我的评论,它是关于“真的需要代表吗?”并用 Func 做一个例子,它是一个委托......
  • 太好了,谢谢。我接受了这个作为答案,因为它直接使用了我的示例。
  • Marc Garvell:我的意思是明确使用关键字委托。使用 Func<...> 是更容易理解和更好的语法糖。
【解决方案3】:

是的,使用委托..

这是一个例子..

delegate string myDel(int s);
public class Program
{
    static string Func(myDel f)
    {
        return f(2);
    }

    public static void Main()
    {
        Test obj = new Test();
        myDel d = obj.func;
        Console.WriteLine(Func(d));
    }
}
class Test
{
    public string func(int s)
    {
        return s.ToString();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多