2011-02-09 34 views
11

Tôi có một điều khiển người dùng tùy chỉnh DatePicker.cs. Bên trong một đoạn mã khác, tôi có một bộ sưu tập các điều khiển nơi tôi đang kiểm tra loại điều khiển và thực hiện một số logic dựa trên loại. Vấn đề của tôi là như sau:Cách lấy "typeof" của điều khiển người dùng tùy chỉnh

typeof(DatePicker) 

Evalutes tới:

{Name = "DatePicker" FullName = "cusitecore.cedarsc.UserControls.DatePicker"} 

Nhưng khi tôi chạy debugger và xem xét các loại điều khiển đó là trên web của tôi hình thành đó là:

{Name = "cedarsc_usercontrols_datepicker_ascx" FullName = "ASP.cedarsc_usercontrols_datepicker_ascx"} 

Hai điều này không bằng nhau nên logic chính xác không được đánh giá. Tôi đã thử bằng cách sử dụng Type.GetType ("ASP.cedarsc_usercontrols_datepicker_ascx") nhưng điều này trả về null.

EDIT

Dưới đây là những gì tôi đang cố gắng để làm:

private readonly Dictionary<Type, ControlType?> _controlTypes = new Dictionary<Type, ControlType?> 
    { 
     {typeof(CheckBox), ControlType.CheckBox}, 
     {typeof(CheckBoxList), ControlType.CheckBoxList}, 
     {typeof(DropDownList), ControlType.DropDownList}, 
     {typeof(HiddenField), ControlType.HiddenField}, 
     {typeof(ListBox), ControlType.ListBox}, 
     {typeof(RadioButton), ControlType.RadioButton}, 
     {typeof(RadioButtonList), ControlType.RadioButtonList}, 
     {typeof(TextBox), ControlType.TextBox}, 
     {typeof(Label), ControlType.Label}, 
     {typeof(DatePicker), ControlType.DatePicker}, 
     {typeof(CustomSelect), ControlType.CustomSelect} 
    }; 

private void PopulateFields(Control control) 
{ 
    ControlType? controlType; 
    _controlTypes.TryGetValue(control.GetType(), out controlType); 

    // recurse over the children 
    if (control.Controls.Count > 0 && controlType == null) // don't want to recurse into children of controls we are reading values of 
    { 
     foreach(Control childControl in control.Controls) 
     { 
      PopulateFields(childControl); 
     } 
    } 

    if (controlType != null) 
    { 
     switch (controlType) 
     { 
      case ControlType.CheckBox: 
      case ControlType.RadioButton: 
       CheckBox checkBox = control as CheckBox; 
        if (checkBox != null) 
         _fields.AddFieldValue(checkBox.ID, checkBox.Checked ? "Checked" : "Not Checked"); 
        break; 
      case ControlType.CheckBoxList: 
      case ControlType.ListBox: 
      case ControlType.RadioButtonList: 
       ListControl listControl = control as ListControl; 
       if (listControl != null) 
        _fields.AddFieldValue(listControl.ID, String.Join(", ", listControl.Items.Cast<ListItem>().Where(item => item.Selected).Select(item => item.Value).ToArray())); 
       break; 
      case ControlType.DropDownList: 
       DropDownList dropDownList = control as DropDownList; 
       if (dropDownList != null) 
        _fields.AddFieldValue(dropDownList.ID, dropDownList.SelectedValue); 
       break; 
      case ControlType.HiddenField: 
       HiddenField hiddenField = control as HiddenField; 
       if (hiddenField != null) 
        _fields.AddFieldValue(hiddenField.ID, hiddenField.Value); 
       break; 
      case ControlType.TextBox: 
       TextBox textBox = control as TextBox; 
       if (textBox != null) 
        _fields.AddFieldValue(textBox.ID, textBox.Text); 
       break; 
      case ControlType.DatePicker: 
       DatePicker datePicker = control as DatePicker; 
       if (datePicker != null) 
        _fields.AddFieldValue(datePicker.ID, datePicker.Text); 
       break; 
      case ControlType.CustomSelect: 
       CustomSelect customSelect = control as CustomSelect; 
       if(customSelect != null) 
        _fields.AddFieldValue(customSelect.ID, customSelect.SelectedValue); 
       break; 
      case ControlType.Label: 
       Label label = control as Label; 
       if(label != null) 
        _fields.AddFieldLabel(label.AssociatedControlID, label.Text); 
       break; 
      default: 
       throw new Exception("Unhandled Control"); 
     } 
    } 
} 
+0

Bạn có thể cung cấp thêm một số ngữ cảnh không? Mã của bạn trông như thế nào đang cố gắng thực hiện so sánh giữa hai loại? –

+4

ASP.NET tạo loại riêng của nó được kế thừa từ điều khiển người dùng.Sử dụng từ khóa 'is' để so sánh và thử' control.GetType(). BaseType' để trích xuất. –

+0

@Jaroslav đây là câu trả lời. Slap mà xuống ở phía dưới để chúng tôi có thể cung cấp cho bạn tín dụng :) – Kyle

Trả lời

11

ASP.NET tạo ra nó là loại riêng trong được trích dẫn từ các điều khiển của người dùng.

Để so sánh, hãy sử dụng toán tử is.
Đối với các trích xuất, sử dụng control.GetType().BaseType.

+0

Vấn đề duy nhất với điều này dường như là gọi .BaseType trên một điều khiển gốc trả về "WebControl". Vì vậy, ví dụ cho một điều khiển đó là một TextBox, control.GetType(). BaseType là "WebControl". Có suy nghĩ gì không? – Kyle

+0

Dựa trên quy ước đặt tên, tên lớp không được chứa '_'. Vì vậy, nếu loại 'EndsWith (" _ ascx ")', bạn có thể khá chắc chắn nó là một điều khiển người dùng và trích xuất tên như được giải thích trong câu trả lời của tôi. –

1

Bạn có thể thử bằng cách sử dụng từ khóa is. Nó không hoàn toàn giống nhau nhưng nếu tất cả những gì bạn đang cố gắng làm là xác định xem một đối tượng có thuộc kiểu nào đó (hoặc mở rộng/triển khai một lớp/giao diện) thì điều đó có nên thực hiện thủ thuật hay không.

Tất nhiên tùy thuộc vào mã của bạn điều này có thể không hữu ích.

+0

Tôi chỉ có vấn đề này ngày hôm nay và (myControl là TypeICareAbout) làm việc. Các "là" kiểm tra từ khóa để xem nếu biến có thể được đúc sang loại mong muốn mà không cần ném một lỗi. Xem: http://msdn.microsoft.com/en-us/library/scekt9xw(v=vs.80).aspx – William

2

Bài đăng của bạn không hoàn toàn phù hợp với cách bạn dự định sử dụng, nhưng tôi chưa bao giờ gặp vấn đề gì với typeof() đang được sử dụng trong các sự kiện của mình. Ví dụ: tôi sẽ có tuyên bố if sau trong một sự kiện xử lý việc di chuột qua:

if (sender.GetType() == typeof(Transparent_Panel)) 

nơi Transparent_Panel là kiểm soát người dùng tùy chỉnh. Tôi không bao giờ thực hiện bất kỳ công việc đặc biệt nào dưới sự quản lý của Tansparent_Panel để thực hiện công việc này.

1

ASP.NET 2.0 trở lên sẽ biên dịch UserControl vào thư mục Tệp ASP.NET tạm thời theo yêu cầu, vì vậy loại bạn đang kiểm tra khi bạn xem loại điều khiển trong trình gỡ lỗi đang được tạo tự động bởi ASP.NET biên dịch động cơ. Các tin tốt là loại này được thừa hưởng từ loại DatePicker, vì vậy đoạn mã sau sẽ làm việc để kiểm tra xem một cho UserControl thực sự là một DatePicker:

typeof(DatePicker).IsAssignableFrom(userControl.GetType().BaseType) 

Ngoài ra, bạn luôn có thể tạo ra một thể hiện của các DatePickerUserControl tại thời gian chạy và kiểm tra các loại tương đương qua:

LoadControl(typeof(DatePicker)).GetType() == userControl.GetType() 

Nguồn: Compilation and Deployment in ASP.NET 2.0

+0

cảm ơn cho lời giải thích thêm về điều này – Kyle

Các vấn đề liên quan