ใช้รูปแบบไดนามิกอาจ? คุณสามารถเรียกวิธีการ / คุณสมบัติใด ๆ โดยใช้คำสำคัญแบบไดนามิกใช่ไหม? วิธีการตรวจสอบว่ามีวิธีการก่อนที่จะเรียก myDynamicObject.DoStuff () ตัวอย่างเช่น?
ใช้รูปแบบไดนามิกอาจ? คุณสามารถเรียกวิธีการ / คุณสมบัติใด ๆ โดยใช้คำสำคัญแบบไดนามิกใช่ไหม? วิธีการตรวจสอบว่ามีวิธีการก่อนที่จะเรียก myDynamicObject.DoStuff () ตัวอย่างเช่น?
คำตอบ:
คุณสามารถเขียนบางอย่างเช่นนั้น:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
แก้ไข: คุณสามารถทำได้แม้กระทั่งวิธีการขยายและใช้มันเช่นนี้
myObject.HasMethod("SomeMethod");
ผ่านการสะท้อนแสง
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
ที่คล้ายกันสำหรับวิธีการ
GetType()
มันจะกลับอาร์เรย์ของGetProperties()
PropertyInfo
แต่ฉันจะใช้GetProperties()
วิธีการได้อย่างไร
มันเป็นคำถามเก่า แต่ฉันเพิ่งพบเจอ
Type.GetMethod(string name)
จะโยน AmbiguousMatchException หากมีมากกว่าหนึ่งวิธีที่มีชื่อนั้นดังนั้นเราควรจัดการกับกรณีนั้น
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;
}
}
มันจะเป็นการดีกว่าหรือที่จะไม่ใช้ประเภทไดนามิกใด ๆ สำหรับสิ่งนี้และให้ชั้นเรียนของคุณใช้อินเทอร์เฟซ จากนั้นคุณสามารถตรวจสอบขณะใช้งานจริงกับวัตถุที่ใช้อินเทอร์เฟซและดังนั้นจึงมีวิธีการที่คาดหวัง (หรือคุณสมบัติ)
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
ฉันคิดว่านี่เป็นวิธีที่ถูกต้องเท่านั้น
สิ่งที่คุณอ้างถึงคือการพิมพ์เป็ดซึ่งมีประโยชน์ในสถานการณ์ที่คุณรู้อยู่แล้วว่าวัตถุนั้นมีวิธีการ แต่คอมไพเลอร์ไม่สามารถตรวจสอบได้ สิ่งนี้มีประโยชน์ในสถานการณ์สมมติ COM interop เช่น (ตรวจสอบนี้บทความ)
หากคุณต้องการผสมผสานการพิมพ์เป็ดกับการสะท้อนกลับฉันคิดว่าคุณพลาดเป้าหมายในการพิมพ์เป็ด
DynamicObject
ไหน?