2013-07-24 59 views
3

我有一個要求將屬性設置爲來自dll引用的客戶端應用程序。如何將類實例作爲參數傳遞給c中的方法#

技術部分如下解釋。

我有一個類的實例

public class test 
{ 
    public string Resultobj; 
    public string Result 
    { 
     get 
     { 
      return Resultobj; 
     } 
     set 
     { 
      Resultobj = value; 
     } 
    } 
    test obj = new test(); 
} 

我作爲駐留在另一個組件中的參數發送到這一種方法。

callmethod(test obj); 

所以在引用的程序集中我需要設置值的實例,以便它可以從應用程序訪問。 任何人都可以提供關於如何將屬性設置爲作爲參數傳遞給方法的類實例的建議。

在這裏,我添加了我所嘗試的,但它的錯誤。 :-(

public override void callmethod(ref object obj) 
{ 
    Type type = Type.GetType(obj); 
    PropertyInfo property = type.GetProperty("Result"); 
    property.SetValue(type , "somevalue", null); 
} 

由於類名的實例在運行時是通過我不能提供的類名作爲數據類型。 我在該行收到錯誤

callmethod(test obj); 

Argument '1': cannot convert from 'test ' to 'ref object' 
+1

property.SetValue(obj,「somevalue」); ? – JleruOHeP

+5

請澄清'其錯誤' – tnw

+4

錯以什麼方式?物業沒有設置?編譯錯誤(我可以看到代碼的一些問題,但假設他們是錯別字)?例外?你需要清楚*爲什麼*它不像你期望的那樣工作。 – James

回答

4

那麼首先你是不是正確地傳遞參數callmethod,所有的,因爲它需要一個參考參數則需要例如使用ref關鍵字

callmethod(ref (object)obj); 

然後在callmethod本身,你的第一行更改爲:

Type type = obj.GetType(); 

Type.GetType需要string代表性的類型,而不是實際的對象實例。最後,更新SetValue調用以使用對象實例,而不是類型例如

property.SetValue(obj, "somevalue"); 
+0

我得到下面的錯誤。錯誤'callmethod(ref object)'的最佳重載方法匹配有一些無效參數錯誤參數'1':無法從'ref test'轉換爲'ref object' –

+0

聽起來就像你傳遞'輸入'到'callmethod'而不是*實例*。如果按照我寫的代碼編寫代碼,它應該可以工作(假設您的問題中的代碼是正確的)。 – James

+0

否..Im傳遞實例不是Type。我在問題中提供的正是我的程序。當我更改行測試obj = new test(); obj = new test()它可以正常工作。 –

0
Type type = Type.GetType(obj); 
PropertyInfo property = type.GetProperty("Result"); 
property.SetValue(type, "somevalue", null); 

的第一行是錯誤的,Type.GetType(...)靜態方法需要一個字符串來告訴它要加載哪一種類型,而不是類型本身的一個實例,但是,由於你有一個實例,你可以調用obj.GetType )它做你想做的事情。

第三行也是錯誤的。 SetValue的第一個參數需要是您想要修改的實例,而不是類型。此外,您不需要第三個參數,因爲SetValue只有前兩個參數有另一個重載。試試這個更改爲:

Type type = obj.GetType(); 
PropertyInfo property =type.GetProperty("Result"); 
property.SetValue(obj, "somevalue"); 
+0

這也是一個問題,但是,OP甚至沒有遇到這個問題。它是調用Type.GetType的第一行,它失敗了,它需要一個類型的字符串表示,並且OP正在傳遞對象。 – James

+0

@詹姆斯,正確的,我甚至沒有注意到(我只是掃描它的眼睛,因爲我已經注意到提供的代碼不會編譯......) – Chris

-1

呃... ...是不是很簡單:

test obj = new test(); 
callmethod(ref obj); 

我看到你已經把test obj = new test();類定義 - 爲什麼?

另外,在C#中,所有的類名都應該使用CamelCase。我想重寫類定義這樣的:

public class Test 
{ 
    public string Result { get; set; } 

    public Test(string result) 
    { 
    Result = result; 
    } 
} 

其中callmethod(它應該被命名爲CallMethod但我離題)的定義將看起來像使用方法:

Test testInstance = new Test("Result string"); 
callmethod(ref testInstance); 

callmethod本身就應該是這個樣子:

public override void CallMethod(ref object obj) 
{ 
    Type type = obj.GetType(obj); 
    PropertyInfo property = type.GetProperty("Result"); 
    property.SetValue(obj, "somevalue"); 
} 

和:

CallMethod(ref testInstance); 

希望這會有所幫助。

+0

'callmethod(obj)'不會編譯,它需要作爲引用傳遞,所以至少它必須是'callmethod(ref obj)'' 。 – James

+0

啊,是的,我忘記了方法簽名。感謝您指出。 –

相關問題