2012-06-22 48 views
5

Tôi có quyền kiểm soát ... bất kỳ System.Windows.Forms.Control. nói cho ví dụ. nhãn.Cách tìm giá trị thuộc tính mặc định của điều khiển khi chạy trong C#

Tôi muốn tìm giá trị mặc định cho thuộc tính của nó được gọi là "Đã bật" (có thể là bất kỳ thuộc tính nào cho vấn đề đó). Tôi phải làm nó như thế nào?

1) Xem, trong trường hợp này, chúng tôi có nhãn. Giá trị mặc định của nhãn cho thuộc tính "Đã bật" là đúng.

2) Hiện tại khi chạy, giả sử tôi muốn tìm hiểu giá trị mặc định cho thuộc tính "Đã bật" là gì ... làm cách nào để tìm hiểu?

3) Để bắt đầu, tôi có đối tượng kiểm soát của mình. Từ đối tượng đó, tôi chỉ có thể nhận được giá trị hiện tại cho thuộc tính "Đã bật" chứ không phải giá trị DEFAULT.

Một cách tiếp cận có thể có cho câu hỏi này có thể là:

1) Xác định loại điều khiển khi chạy. 2) Khởi tạo nó bằng cách sử dụng hàm tạo mặc định của nó. 3) Tìm giá trị của tài sản mà chúng tôi quan tâm (Nó rõ ràng sẽ là giá trị mặc định) và ở đó .. chúng tôi có giá trị mặc định.

Nhưng, trong trường hợp này .. Tôi không biết quyền kiểm soát của mình trước khi thực hiện. Tất cả những gì tôi biết là, nó có thể là bất kỳ sự kiểm soát nào từ System.Windows.Forms.Control. Vì vậy, làm thế nào để tôi thậm chí khởi tạo nó và nhận được đối tượng của nó? Có thể không?

Bạn có giải pháp thay thế/phương pháp tiếp cận nào tốt hơn không?

+1

Không có khái niệm kiểm soát nào có giá trị "mặc định". Trình thiết kế Visual Studio có thể cho phép kiểm soát các giá trị mặc định khi chúng được thêm vào biểu mẫu, nhưng chúng chỉ được ghi vào tệp .designer, ví dụ: myControl.Enabled = true; – PeteH

Trả lời

4

Đây là cơ hội tốt để sử dụng sự phản chiếu! Dưới đây là một phương pháp mà sẽ nhận được các giá trị mặc định của bất kỳ tài sản cho bất kỳ loại trong đó có một constructor mặc định (công cộng, không có tham số):

public static object GetDefaultPropertyValue(Type type, string propertyName) 
{ 
     if (type.GetConstructor(new Type[] { }) == null) 
      throw new Exception(type + " doesn't have a default constructor, so there is no default instance to get a default property value from."); 
     var obj = Activator.CreateInstance(type); 
     return type.GetProperty(propertyName).GetValue(obj, new object[] { }); 
} 

Lưu ý rằng nếu bạn đang làm điều này với một số lượng lớn của các điều khiển trong đó có có thể là bội số của một loại duy nhất, bạn có thể muốn lưu vào bộ nhớ cache kết quả cho từng loại, vì sự phản chiếu hơi chậm.

+0

Bạn cũng có thể xem xét việc kéo thuộc tính "DefaultValue" và đọc cũng như: type.GetCustomAttributes (typeof (System.ComponentModel.DefaultValueAttribute), false) –

3

Bạn có thể instanciate một (tại thời gian thiết kế) đối tượng không rõ sử dụng Generics.

public class DefaultValueChecker<T> where T : System.Windows.Forms.Control, new() 
{ 
    public bool DetermineDefaultValue() { 
     var control = new T(); 
     return control.Enabled; 
    } 
} 
+1

Điều đó yêu cầu * biết điều khiển trước *, được loại trừ rõ ràng trong câu hỏi. 'T' có thể không biết tại thời điểm thiết kế trong lớp' DefaultValueChecker ', nhưng bất kỳ mã gọi nào cũng cần biết' T' tại thời điểm thiết kế. –

+0

Câu hỏi nói "Tôi có [...] bất kỳ System.Windows.Forms.Control". Và đó là chính xác những gì tôi yêu cầu. Vui lòng đọc lại câu hỏi, rồi câu trả lời của tôi. –

+0

Nó cũng nói * Tôi không biết điều khiển của mình trước khi tay. Tất cả những gì tôi biết là, nó có thể là bất kỳ điều khiển nào từ System.Windows.Forms.Control. * Điều này nghe giống như loại điều khiển không được biết, vì vậy nó không thể được sử dụng như một đối số kiểu. –

0

Thông thường không thể phát hiện ra điều này. Giá trị mặc định có thể là những điều sau đây:

  • mã hóa cứng
  • phụ thuộc vào các nguồn lực (trao đổi)
  • phụ thuộc vào thiết lập hệ thống

Với cách tiếp cận đề nghị của bạn, bạn có thể tối đa là tìm các giá trị mã hóa cứng. Tuy nhiên, bạn sẽ không có cách nào để nói liệu chúng có thực sự được mã hóa hay không.

Đối với phần thứ hai của câu hỏi, điều này có thể được giải quyết bằng cách sử dụng sự phản chiếu: Hãy xem lớp Type (thông tin kiểu thời gian chạy) và lớp Activator (loại thời gian chạy).

0

Bạn có thể thử sử dụng phản ánh và kiểm tra các DefaultValue thuộc tính:

Type labelType = typeof(Label); 
DefaultValueAttribute attr = (DefaultValueAttribute)labelType 
    .GetProperty("AutoEllipsis") 
    .GetCustomAttributes(typeof(Defaul tValueAttribute),true) 
    .FirstOrDefault(); 
Console.WriteLine(attr.Value); 

Tuy nhiên, không phải tất cả các thuộc tính được chú thích với thuộc tính này, vì vậy không phải tất cả các giá trị mặc định có thể thu được theo cách này.

+0

Trên thực tế thuộc tính này chỉ được sử dụng để so sánh giá trị hiện tại với một "mặc định" để biết liệu các giá trị có thay đổi hay không và cần được tô đậm trong một lưới thuộc tính. – ja72

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