2010-03-30 3 views
0

Я пытаюсь создать метод, который принимает несколько типов элементов управления - в этом случае Ярлыки и панели. Преобразование не работает, потому что IConvertible не преобразует эти типы. Любая помощь была бы настолько оценена. Спасибо заранееСоздать метод обработки нескольких типов элементов управления

public void LocationsLink<C>(C control) 
    { 
     if (control != null) 
     { 
      WebControl ctl = (WebControl)Convert.ChangeType(control, typeof(WebControl)); 
      Literal txt = new Literal(); 
      HyperLink lnk = new HyperLink(); 
      txt.Text = "If you prefer a map to the nearest facility please "; 
      lnk.Text = "click here"; 
      lnk.NavigateUrl = "/content/Locations.aspx"; 
      ctl.Controls.Add(txt); 
      ctl.Controls.Add(lnk); 
     } 
    } 

ответ

3

Разве вы хотите где ограничение на управление следующим образом:

public void LocationsLink<C>(C control) where C : WebControl 
{ 
    if (control == null) 
     throw new ArgumentNullException("control"); 

    Literal txt = new Literal(); 
    HyperLink lnk = new HyperLink(); 
    txt.Text = "If you prefer a map to the nearest facility please "; 
    lnk.Text = "click here"; 
    lnk.NavigateUrl = "/content/Locations.aspx"; 
    control.Controls.Add(txt); 
    control.Controls.Add(lnk); 
} 

В where ограничений силы control быть типа WebControl поэтому преобразование не требуется. Из-за ограничения where вы знаете, что control является классом и его можно сравнить с null и что он имеет коллекцию Controls.

Я также изменяю код, чтобы исключить исключение, если control равно null. Если вы действительно просто хотели игнорировать ситуации, когда передан пустой аргумент, просто измените это значение throw new ArgumentNullException("control"); на return null;. Учитывая ограничение компиляции, я бы подумал, что передача null в вашу подпрограмму будет неожиданной и должна вызвать исключение, но я не знаю, как будет использоваться ваш код.

+0

Благодарим за ответ. Можете ли вы сделать еще один шаг и показать, что еще я сделаю в методе, чтобы облегчить преобразование? В то же время я буду исследовать ограничения. – Praesagus

+0

Я расширил свой пост для вас. – Thomas

+0

Спасибо, что нашли время, чтобы объяснить это. Ты просто дал мне еще один отличный инструмент. – Praesagus

Смежные вопросы