2009-11-04 37 views
0

讓我解釋一下。我有一個列表,我添加了各種ASP.NET控件。 然後,我希望遍歷列表並設置一個CssClass,但不是每個控件都支持屬性CssClass。當我不知道類型時,是否可以在僅在實例類型上聲明的對象上設置屬性?

我想要做的是測試底層實例類型是否支持CssClass屬性並對其進行設置,但我不確定如何在設置屬性之前進行轉換,因爲我不知道類型每個控制對象。

我知道我可以使用typeof或x.GetType(),但我不知道如何使用它們將控件轉換回實例類型以便測試並設置屬性。


其實我似乎已經解決了這一點,所以我想我會在這裏發佈的代碼爲別人着想。

foreach (Control c in controlList) { 
    PropertyInfo pi = c.GetType().GetProperty("CssClass"); 
    if (pi != null) pi.SetValue(c, "desired_css_class", null); 
} 

我希望這可以幫助別人,因爲我花了數小時研究這兩行代碼。

乾杯

史蒂夫

+0

出於好奇 - 過了很久才找到答案? – 2009-11-04 23:18:26

+0

良好的工作。發佈它作爲答案史蒂夫。 – 2009-11-04 23:19:26

+0

花了這麼長時間不知道從哪裏開始以及要搜索什麼。 我花了很長時間試圖找到一種方法將對象轉換回其實例類型,但我找不到如何聲明將保存該類型的變量,因爲我不知道它是類型的。 也許有人可以告訴我如何做到這一點? – WilberBeast 2009-11-05 00:14:24

回答

0

只要遵循普里特的意見,我也張貼了這個作爲一個答案。

foreach (Control c in controlList) { 
    PropertyInfo pi = c.GetType().GetProperty("CssClass"); 
    if (pi != null) pi.SetValue(c, "desired_css_class", null); 
} 

我希望這可以幫助未來的人(可能是我,當我谷歌再次)。

0

您可能想要考慮重新設計這些類,使它們沿着提供CssClass屬性的行實現接口ICssControl或其他東西。

interface ICssControl 

string CssClass {get;集;}}

然後你可以實現你的邏輯:

string desiredCssClass = "desired_css_class"; 
foreach (var control in controlList) 
{ 
    var cssObj = control as ICssControl; 
    if (cssObj != null) 
     cssObj.CssClass = desiredCssClass; 
} 

這可以讓你遠離需要在所有使用反射並且應該更容易重構以後。

編輯

在重新閱讀你的問題,也許你已經有了這個接口,並詢問如何將它轉換回該接口?

相關問題