我有一个System.Collections.Generic.Dictionary<System.Web.UI.Control, object>
,其中所有密钥都可以是System.Web.UI.WebControls.HyperLink
类型或System.Web.UI.WebControls.Label
类型。
我想更改每个控件的Text
属性。因为HyperLink没有实现(为什么?!)ITextControl
,所以我需要明确地转换Label或HyperLink:
Dictionary<Control,object> dic = ..
dic
.Where(p => p.Key is HyperLink)
.ForEach(c => ((HyperLink)c).Text = "something")
dic
.Where(p => p.Key is Label)
.ForEach(c => ((Label)c).Text = "something")
有办法解决这种方法吗?
答案 0 :(得分:5)
略微优雅,但保留了问题:
foreach (HyperLink c in dic.Keys.OfType<HyperLink>())
{
c.Text = "something";
}
foreach (Label c in dic.Keys.OfType<Label>())
{
c.Text = "something";
}
答案 1 :(得分:3)
您可以创建一个派生自HyperLink的类,让您的类继承自ITextControl。应该清楚从那里去哪里......
答案 2 :(得分:2)
dic.ForEach(c => c.Key.GetType()
.GetProperty("Text")
.SetValue(c.Key, "Something",null));
完全破解,可能效率不高,但它应该有效....
编辑:另外值得一提的是,如果你使用.Net 4,你可以使用鸭子打字:
dic.ForEach(kvp => ((dynamic)kvp.Key).Text = "Something");
答案 3 :(得分:2)
这种方式看起来更丑陋,更笨拙,但至少你只是在字典上进行一次枚举:
dic
.ForEach(
c => {
var clink = c as Hyperlink;
if (clink != null) {
clink.Text = "something";
return;
}
var clabel = c as Label;
if (clabel != null) {
clabel.Text = "something";
return;
}
}
);
答案 4 :(得分:1)
与丹涛的答案相同 - 只是为了最小的笨拙。
foreach(Control c in dic.Keys)
{
HyperLink clink = c as Hyperlink;
if (clink != null)
{
clink.Text = "something";
continue;
}
Label clabel = c as Label;
if (clabel != null)
{
clabel.Text = "something";
continue;
}
}
答案 5 :(得分:0)
除非Text是Control的属性,否则在单独的语句中指定它会更清楚。我不会试图将它们组合起来只是因为它们都使用“Text”这个词来定义属性。