Cách kiểm tra đơn giản nhất nếu một đối tượng thực hiện giao diện đã cho trong C # là gì? (Trả lời câu hỏi này bằng Java )
Cách kiểm tra đơn giản nhất nếu một đối tượng thực hiện giao diện đã cho trong C # là gì? (Trả lời câu hỏi này bằng Java )
Câu trả lời:
if (object is IBlah)
hoặc là
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
Sử dụng is
hoặc as
toán tử là cách chính xác nếu bạn biết loại giao diện tại thời gian biên dịch và có một phiên bản của loại bạn đang kiểm tra. Một cái gì đó mà không ai khác dường như đã đề cập là Type.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
Tôi nghĩ rằng điều này gọn gàng hơn nhiều so với việc xem qua mảng được trả về GetInterfaces
và cũng có lợi thế làm việc cho các lớp.
typeof(IList).IsAssignableFrom(someType)
mà không cần <>
.
Ví dụ:
if (obj is IMyInterface) {}
Dành cho lớp:
Kiểm tra nếu typeof(MyClass).GetInterfaces()
chứa giao diện.
Nếu bạn muốn sử dụng đối tượng typecasted sau khi kiểm tra:
Vì C # 7.0:
if (obj is IMyInterface myObj)
Điều này giống như
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
Xem .NET Docs: Mẫu khớp với mẫu is
# Type
Ngoài việc kiểm tra bằng toán tử "is", bạn có thể trang trí các phương thức của mình để đảm bảo rằng các biến được truyền cho nó thực hiện một giao diện cụ thể, như vậy:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
Tôi không chắc chắn phiên bản nào của .Net này đã được triển khai để có thể không hoạt động trong phiên bản của bạn.
Những gì làm việc cho tôi là:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
Gần đây tôi đã thử sử dụng câu trả lời của Andrew Kennan và nó không hiệu quả với tôi vì một số lý do. Tôi đã sử dụng điều này thay vào đó và nó hoạt động (lưu ý: viết không gian tên có thể được yêu cầu).
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
Tôi đã có một tình huống khi tôi chuyển một biến cho một phương thức và không chắc nó sẽ là một giao diện hay một đối tượng.
Các mục tiêu là:
Tôi đã đạt được điều này với những điều sau đây:
if(!typeof(T).IsClass)
{
// If your constructor needs arguments...
object[] args = new object[] { my_constructor_param };
return (T)Activator.CreateInstance(typeof(T), args, null);
}
else
return default(T);
Điều này sẽ làm việc:
MyInstace.GetType().GetInterfaces();
Nhưng cũng tốt:
if (obj is IMyInterface)
Hoặc thậm chí (không thanh lịch):
if (obj.GetType() == typeof(IMyInterface))