Where()在Dictionary.Where中使用Replace()(p => p.Key是T)

时间:2010-05-18 17:21:01

标签: c# asp.net linq dictionary web-controls

我有一个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")

有办法解决这种方法吗?

6 个答案:

答案 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”这个词来定义属性。