อะไรคือวิธีที่ง่ายที่สุดในการทดสอบว่าวัตถุใช้อินเทอร์เฟซที่กำหนดใน C # หรือไม่ (ตอบคำถามนี้ ใน Java )
อะไรคือวิธีที่ง่ายที่สุดในการทดสอบว่าวัตถุใช้อินเทอร์เฟซที่กำหนดใน C # หรือไม่ (ตอบคำถามนี้ ใน Java )
คำตอบ:
if (object is IBlah)
หรือ
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
การใช้is
หรือas
โอเปอเรเตอร์เป็นวิธีที่ถูกต้องหากคุณรู้ว่าประเภทอินเตอร์เฟสในเวลารวบรวมและมีอินสแตนซ์ของประเภทที่คุณกำลังทดสอบ สิ่งที่ดูเหมือนไม่มีใครพูดถึงคือType.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
ฉันคิดว่านี่เป็นเรื่องที่น่าสนใจมากกว่าการดูอาเรย์ที่ส่งคืนมาGetInterfaces
และมีข้อได้เปรียบในการทำงานสำหรับชั้นเรียนด้วย
typeof(IList).IsAssignableFrom(someType)
<>
สำหรับตัวอย่าง:
if (obj is IMyInterface) {}
สำหรับชั้นเรียน:
ตรวจสอบว่าtypeof(MyClass).GetInterfaces()
มีส่วนต่อประสานหรือไม่
หากคุณต้องการใช้วัตถุ typecasted หลังจากการตรวจสอบ:
ตั้งแต่ C # 7.0:
if (obj is IMyInterface myObj)
นี่คือเช่นเดียวกับ
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
ดูเอกสาร. NET: การจับคู่is
รูปแบบที่มีรูปแบบ # Type
รูปแบบของคำตอบ @ AndrewKennan ของฉันที่ฉันใช้เมื่อไม่นานมานี้สำหรับประเภทที่ได้รับขณะใช้งานจริง:
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
นี้โพสต์เป็นคำตอบที่ดี
public interface IMyInterface {}
public class MyType : IMyInterface {}
นี่คือตัวอย่างง่ายๆ:
typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
หรือ
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
นอกเหนือจากการทดสอบโดยใช้โอเปอเรเตอร์ "is" แล้วคุณสามารถตกแต่งวิธีการของคุณเพื่อให้แน่ใจว่าตัวแปรที่ส่งผ่านไปยังอินเทอร์เฟซที่เฉพาะเจาะจงเช่น:
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
ฉันไม่แน่ใจว่าเวอร์ชั่นของ. Net นี้ได้รับการติดตั้งใช้งานหรือไม่ในเวอร์ชันของคุณ
สิ่งที่ได้ผลสำหรับฉันคือ:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
เมื่อเร็ว ๆ นี้ฉันลองใช้คำตอบของ Andrew Kennan และมันก็ไม่ได้ผลสำหรับฉันด้วยเหตุผลบางอย่าง ฉันใช้สิ่งนี้แทนและใช้งานได้ (หมายเหตุ: อาจจำเป็นต้องเขียนเนมสเปซ)
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
ฉันใช้
Assert.IsTrue(myObject is ImyInterface);
สำหรับการทดสอบในการทดสอบหน่วยของฉันซึ่งการทดสอบที่ myObject เป็นวัตถุที่ใช้อินเตอร์เฟซของฉัน ImyInterface
ฉันมีสถานการณ์ที่ฉันส่งตัวแปรไปยังเมธอดและไม่แน่ใจว่ามันจะเป็นอินเทอร์เฟซหรือวัตถุ
เป้าหมายคือ:
ฉันทำสิ่งนี้สำเร็จด้วยสิ่งต่อไปนี้:
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);
สิ่งนี้น่าจะใช้ได้:
MyInstace.GetType().GetInterfaces();
แต่ก็ดีเช่นกัน:
if (obj is IMyInterface)
หรือแม้กระทั่ง (ไม่สง่างามมาก):
if (obj.GetType() == typeof(IMyInterface))