0

我已经引用了一个 DLL(我有这个的源代码)说 Dll_A 其中有一个函数

private void uploadPic(int a)

在我的主要项目中,我有一个功能说

private void passMe(int b)
{
}

我需要将上述函数 ( passMe) 传递给uploadPicDll_A 中的函数,我该怎么做?可能吗?我可以从我的主项目中使用 Dll_A 的函数,所以实例化不是问题,我只需要一种传递函数的方法。

=== 谢谢,试试看。如果有人可以编辑下面的代码

//code in main project  picbackman.cs
public delegate void delObj(int v);
private void uploadSome(string path, string fName, string str)
{
delObj del1 = new delObj(updatePValue);
UploadFileResponse response =  boxProvider1.UploadFiles(args1, folderString, ((Picbackman.BoxProvider.delObj)( del1)));
}
//code in different dll which is referenced in main project //Dll_A                     

public delegate void delObj(int v);
public UploadFileResponse UploadFiles(string[] filePathes,string folderId, delObj d)
{}
4

2 回答 2

3

首先,您的方法需要接受委托作为其参数之一。那会是这样的

private void uploadPic(Action<int> func,int a){
   //at some point do func(someInt);
}

在另一点声明另一个方法或函数

public class someClasse {
   public vois passMe(int b){
  ...
  }
}

首先请注意访问修饰符已更改。如果它们不在同一个类中,则您将需要能够从另一个类中访问它们,因此它们不能都是私有的,并且由于它们位于不同的程序集中,因此内部也无法正常工作。

当你需要委托时这样做

var obj = new someClass();
var myInt = 5; //or whatever the value is
uploadPic(obj.passMe,myInt);

请注意,该方法与 out 参数一起使用。当使用不带参数的方法时,编译器将尝试将其转换为合适的委托。

我建议您不要使用delegate但坚持使用 Func/Action 它们是代表但更通用

public delegate void DelObj1();
public delegate void DelObj2()

public void F(){};

var del1 = new DelObj1(F);
var del2 = new DelObj2(F);

即使您对每个都使用相同的方法,也不能在需要 DelObj2 的地方传递 del1。如果您使用 Action/Function,您将不会遇到该问题

Action del1 = F;
Action del2 = F;

原因是 DelObj1 和 DelObj2 是具有相同基类的两个不同类,即它们是类型树中的兄弟。Actiondel1 和 del2 的使用类型相同

于 2012-10-26T07:39:35.230 回答
3

你应该看看Delegates

从文档中:

委托是一种引用方法的类型。一旦为委托分配了一个方法,它的行为就与该方法完全相同。委托方法可以像任何其他方法一样使用,带有参数和返回值

委托允许方法作为参数传递

因此,在您的情况下,您应该能够执行以下操作:

// define the delegate
public delegate int PictureDelegate(int value)

// define your passMe function (in the class MyClass for example)
public int passMe(int value)
{
    return value + 1;
}

// when you want to use it
MyClass myInstance = new MyClass();
PictureDelegate passFunc = new PictureDelegate(myInstance.passMe);
myDll.uploadPic(passFunc, 12);
于 2012-10-26T06:56:06.777 回答