2011-07-14 70 views
6

我有一個方法,應該返回列表中的ID。 通常我會爲這個任務使用反射(我不能使用泛型方法,因爲類通常是POCOS,不共享接口或基類,我不能修改它們)。不過,我想到了關於新的dynamic關鍵字,並想嘗試這一點。使用C#動態方法的對象

但是我的問題是dataSource [index]返回一個對象。那麼在運行時確保對象本身就是我自己的類,並有一個id屬性。 但我想,因爲該方法返回一個對象,我在運行時得到一個RumtineBinderException在訪問current.id

public List<int> GetItemIds() 
{ 

    var result = new List<int>(); 
    var dataSource = GetDataSource(); // returns an List<Object> 

    for (int i = 0; i <= dataSource.Count - 1; i++) 
    { 
     dynamic current = dataSource[i]; 
     int id = current.Id; // throws RuntimeBinderException: Object has no definition for id 
    } 

    return result; 
} 

有沒有辦法才達到我想要什麼或做我必須回去反射來獲取id屬性?

更新:

current.GetType() returns object 
current.GetType().GetProperties() returns a TargetInvocationException 

我波蘇斯住在我的主要項目(VB.net),但這種方法是在類libary,或許這就是原因。但是:

object current = dataSource[i]; 
PropertyInfo prop = current.GetType().GetProperty("id", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); 
if (prop != null) 
{ 
    int id = (int)prop.GetValue(current, null); 
} 

的作品。

+0

什麼是current.GetType()?這是你期望的類型嗎? –

+0

這裏有一些錯誤....在上面的例子中使用動態應該使它工作,如果運行時類型有一個Id屬性... – Jeff

+0

它應該工作 - 你可以更新與current.GetType() ,和current.GetType()。GetProperties()? – carlosfigueira

回答

1

我相信您可能需要將「GetDataSource()」的返回類型定義爲「List<dynamic>」。

當然,正如評論中所述,對象必須定義屬性「id」。

+0

雖然我的猜測是你不會因'GetDataSource()'列表'而破壞任何東西,因爲它在技術上編入帶有類型檢查的列表,它看起來很糟糕,因爲列表不是協變的,因爲你不能做同樣的例如,如果返回List 。無論哪種方式,它不是解決方案,因爲你仍然告訴編譯器將索引的返回對象視爲動態的,所以應該沒有區別。 – jbtule

1

C#區分大小寫,包括使用動態關鍵字時的情況。你的電話是int id = current.Id;,但你談論屬性是小寫的id,你的反射調用看起來不區分大小寫。動態關鍵字應該沒有問題,甚至跨越裝配邊界調用公共實例屬性,因爲它表示找不到方法我最好的猜測是你需要使用int id = current.id;

+0

在我的真實世界應用程序中,屬性是小寫字母,我使用'current.id'來訪問它。 (但我在示例代碼中混合了它)。但是,即使我看到在監視窗口中的屬性通過代碼failes訪問它。 –