Sử dụng mô hình độ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 thức có tồn tại hay không trước khi gọi myDocateObject.DoStuff () chẳng hạn?
Sử dụng mô hình độ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 thức có tồn tại hay không trước khi gọi myDocateObject.DoStuff () chẳng hạn?
Câu trả lời:
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;
}
Chỉnh sửa: bạn thậm chí có thể thực hiện một phương thức mở rộng và sử dụng nó như thế này
myObject.HasMethod("SomeMethod");
thông qua sự phản ánh
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
Tương tự là cho các phương thức
GetType()
đó có phương pháp như thế nào GetProperties()
. Nó đang trả về mảng của PropertyInfo
. Nhưng làm thế nào tôi có thể sử dụng GetProperties()
phương pháp?
Đó là một câu hỏi cũ, nhưng tôi chỉ gặp phải nó.
Type.GetMethod(string name)
sẽ đưa ra một AmbiguptMatchException nếu có nhiều hơn một phương thức có tên đó, vì vậy chúng tôi xử lý trường hợp đó tốt hơn
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;
}
}
Sẽ không tốt hơn nếu không sử dụng bất kỳ loại động nào cho việc này và để lớp của bạn thực hiện một giao diện. Sau đó, bạn có thể kiểm tra trong thời gian chạy khi một đối tượng thực hiện giao diện đó và do đó, có phương thức (hoặc thuộc tính) dự kiến.
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
Tôi nghĩ rằng đây là cách duy nhất đúng.
Điều bạn đang đề cập đến là gõ vịt, 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 kịch bản tương tác COM chẳng hạn. (kiểm tra này bài viết)
Nếu bạn muốn kết hợp gõ vịt với phản chiếu chẳng hạn, thì tôi nghĩ bạn đang thiếu mục tiêu gõ vịt.
DynamicObject
?