2011-02-25 58 views
120

Sử dụng mẫu động có lẽ? Bạn có thể gọi bất kỳ phương thức/thuộc tính nào bằng cách sử dụng từ khóa động, phải không? Làm thế nào để kiểm tra xem phương pháp tồn tại trước khi gọi myDynamicObject.DoStuff(), ví dụ?Cách kiểm tra xem một đối tượng có phương pháp/thuộc tính nhất định không?

+0

loại * myDynamicObject * là gì? Nó có phải là một lớp bắt nguồn từ 'DynamicObject'? –

+0

điều gì đó được khai báo với từ khóa động –

Trả lời

180

Bạn có thể viết một cái gì đó như thế:

public static bool HasMethod(this object objectToCheck, string methodName) 
{ 
    var type = objectToCheck.GetType(); 
    return type.GetMethod(methodName) != null; 
} 

Edit: bạn thậm chí có thể làm một phương pháp mở rộng và sử dụng nó như

này
myObject.HasMethod("SomeMethod"); 
+0

GetType() sẽ trả về kiểu thời gian chạy? (tức là không phải đối tượng?) –

+2

có, GetType() trả về kiểu đang chạy trong khi typeof() sẽ trả về đối tượng. – Julien

+1

Theo tài liệu GetType() sẽ trả về "Loại thời gian chạy chính xác của cá thể hiện tại". – tzup

14

Sẽ tốt hơn nếu bạn không sử dụng bất kỳ loại động nào cho điều này và để cho lớp của bạn triển khai giao diện. Sau đó, bạn có thể kiểm tra tại thời điểm chạy một đối tượng thực hiện giao diện đó, và do đó, có phương thức dự kiến ​​(hoặc thuộc tính).

public interface IMyInterface 
{ 
    void Somemethod(); 
} 


IMyInterface x = anyObject as IMyInterface; 
if(x != null) 
{ 
    x.Somemethod(); 
} 

Tôi nghĩ đây là cách chính xác duy nhất. Điều bạn đang đề cập đến là gõ vịt, điều này rất hữu ích trong các tình huống mà bạn đã biết rằng đối tượng có phương thức, nhưng trình biên dịch không thể kiểm tra điều đó. Điều này rất hữu ích trong các trường hợp COM interop chẳng hạn. (kiểm tra this bài viết)

Nếu bạn muốn kết hợp kiểu gõ vịt với sự phản chiếu chẳng hạn, thì tôi nghĩ bạn đang thiếu mục tiêu gõ vịt.

+2

nếu đối tượng có thể là đối tượng do .NET framework cung cấp và tôi không thể khai báo nó để triển khai bất kỳ thứ gì? –

+0

Có vấn đề gì? Bạn có thể kiểm tra xem 'đối tượng' có phải là một đối tượng như vậy, được cung cấp bởi khuôn khổ .NET giống như cách –

+0

chẳng hạn, bạn muốn kiểm tra xem có phương thức "Thêm" trong một đối tượng hay không. ANd đối tượng có thể là một Danh sách , hoặc một số lớp khác không phải là một IEnumerable –

64

qua Reflection

var property = object.GetType().GetProperty("YourProperty") 
property.SetValue(object,some_value,null); 

tương tự là cho các phương pháp

+0

Tốt. Bạn cũng có thể làm GetMethod trong một vòng lặp để có được thuộc tính được xác định thích hợp. – Jnr

32

Đó là một câu hỏi cũ, nhưng tôi chỉ chạy vào nó. Type.GetMethod(string name) sẽ ném một AmbiguousMatchException nếu có nhiều hơn một phương pháp với tên đó, vì vậy chúng ta nên xử lý trường hợp đó

public static bool HasMethod(this object objectToCheck, string methodName) 
{ 
    try 
    { 
     var type = objectToCheck.GetType(); 
     return type.GetMethod(methodName) != null; 
    } 
    catch(AmbiguousMatchException) 
    { 
     // ambiguous means there is more than one result, 
     // which means: a method with that name does exist 
     return true; 
    } 
} 
Các vấn đề liên quan