2011-05-13 85 views
0

我有一個IList只讀屬性的類。我創建了一個簡單的擴展方法AddCSV,將多個項目添加到該列表中。我想創建一個動作委託來通過擴展方法填充列表。到目前爲止,我有CreateDelegate在擴展方法

private Action<TListPropertyContainer, TDataValue> CreateListPropertySetter<TListPropertyContainer, TDataValue>(string listName) 
{ 
    var list = typeof(TListPropertyContainer).GetProperty(listName); 
    var method = typeof(Extensions).GetMethod("AddCSV"); 
    return (Action<TListPropertyContainer, TDataValue>)Delegate.CreateDelegate(typeof(Action<TListPropertyContainer, TDataValue>), list, method); 
} 

但顯然這是行不通的!

我知道還有其他的選擇。例如 一)我可以繼承列表到我自己的客戶類,並添加AddCSV有 B)我可以做的項目屬性讀/寫,並設置一個完全填充的名單到類

我會很感激,如果有人可以糾正我。

許多THX

西蒙

回答

2

有兩個主要問題。

  1. 您試圖調用PropertyInfo上的方法,而不是列表。要獲得物業的價值,您需要致電GetValue()

  2. GetMethod()的呼叫未指定綁定標誌。我懷疑它可能會更好地與GetMethod("AddCSV", BindingFlags.Public | BindingFlags.Static)

這就是說,爲什麼當你事先知道類型和方法時反射性地實例化它?好像你可能只是這樣做:

private Action<TListPropertyContainer, TDataValue> CreateListPropertySetter<TListPropertyContainer, TDataValue>(string listName) 
{ 
     var propertyInfo = typeof(TListPropertyContainer).GetProperty(listName); 
     return (container,value) => { 
      var list = (IList<TDataValue>)propertyInfo.GetValue(container,null); 
      list.AddCSV(list); 
     }; 
    } 

如果我在做有關擴展方法的簽名或屬性的類型不正確的假設,你仍然可以用Delegate.CreateDelegate()做到這一點,而是採取對PropertyInfo的意見和BindingFlags考慮到

+0

許多thx。你是對的,我已經過於複雜了!你的代碼示例有訣竅。 – 2011-05-13 10:27:26

1

您正在嘗試使用list作爲委託的目標 - 但listPropertyInfo類型,這聽起來就像是你期待什麼。假設你想獲取屬性的的值,然後調用該方法,則還需要傳遞包含該屬性的對象,以便可以獲取實際列表。 (或者,也許它是「這個」 - 你還沒有真正清楚。)無論採用哪種方式,你都可以得到清單本身,並使用作爲目標。例如:

private Action<TListPropertyContainer, TDataValue> 
    CreateListPropertySetter<TListPropertyContainer, TDataValue> 
    (string listName, object target) 
{ 
    var listProperty = typeof(TListPropertyContainer).GetProperty(listName); 
    object list = listProperty.GetValue(target, null); 
    var method = typeof(Extensions).GetMethod("AddCSV"); 
    return (Action<TListPropertyContainer, TDataValue>)Delegate.CreateDelegate(
     typeof(Action<TListPropertyContainer, TDataValue>), list, method); 
} 

如果這沒有幫助,請用短編輯您的問題,但完整控制檯應用程序演示問題。現在有太多的未知數,肯定會幫助你。

+0

Thx喬恩。我從你所說的話看到我的錯誤。我會處理一個樣本。這裏的問題是,當調用委託而不是創建代理時,我將傳遞實例 – 2011-05-13 10:13:38