2012-10-26 26 views
0

我已經引用的一個DLL(我有這個源代碼)說Dll_A,其中有一個功能如何通過功能包括項目作爲參考不同的DLL

private void uploadPic(int a) 

在我的主要項目,我有功能說

private void passMe(int b) 
{ 
} 

我需要將上面的函數(passMe)傳遞給在Dll_A 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) 
{} 
+1

如何在'uploadPic'採用int時傳遞函數? – nawfal

回答

3

首先你的方法將需要接受委託作爲它的一個參數。這將是像

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

在另一點聲明anothe方法或函數

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鍵棒/動作他們的代表,但更通用的

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是兩個不同的班級,同一個基類即它們在類型樹的兄弟姐妹,你不會有這個問題。使用Action del1和del2的類型相同

+0

謝謝,試試看。如果某些人可以編輯 以下的代碼 //代碼在主項目\t 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))); }在不同的dll //代碼,其在主項目中引用// Dll_A \t \t \t \t \t \t 公共委託無效delObj(INT V); public UploadFileResponse UploadFiles(string [] filePathes,string folderId,delObj d) {} – Sujit

+0

該代碼作爲註釋相當難以理解。將其作爲問題的一部分發布 –

+1

我編輯了我的原始問題以解釋,我不知道如何作爲問題的一部分進行發佈。 – Sujit

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

感謝您的回覆。但是,當我嘗試通過委託它說,不能將此類型轉換爲該類型.. Nawfail:我可以編輯該函數接受除了它正在接受的int函數。我只是不知道該怎麼做 – Sujit

+0

我編輯了我的答案,添加了一個似乎與您的案例相對應的代碼示例。 HTH –

+0

@sujit如果你有豪華的修改dll函數,那麼它很容易。你可以使用如圖所示的委託或內置的Func代表 – nawfal