0

私は1つのDLLを参照しました(私はこれのソースコードを持っています)、関数があるDll_Aと言います

private void uploadPic(int a)

私のメインプロジェクトでは、次のような機能があります

private void passMe(int b)
{
}

Dll_Aで機能するには、上記の関数(passMe)を渡す必要がありuploadPicますが、どうすればよいですか?出来ますか?メインプロジェクトの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

をご覧ください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 に答える
3

まず、メソッドは、そのパラメーターの1つとしてデリゲートを受け入れる必要があります。それは次のようなものになります

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);

メソッドが引数なしで使用されていることに注意してください。引数なしでメソッドを使用する場合、コンパイラはそれを適切なデリゲートに変換しようとします。

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 del1 = F;
Action del2 = F;

その理由は、DelObj1とDelObj2は、同じ基本クラスを持つ2つの異なるクラスであるためです。つまり、タイプツリーの兄弟です。タイプの使用Actionは、del1とdel2の両方で同じです。

于 2012-10-26T07:39:35.230 に答える