[英]Executing a function of an uncasted object
我正在實現一個通過特定功能獲取對象(作為參數)的Web控件-讓我們稱之為DoStuff()-該對象可以屬於不同的類,這些類都派生自抽象類-讓我們稱之為超類-此超類沒有DoStuff()方法。
所以我的問題是:如果對象中存在此方法,而不必將其強制轉換為派生類,則C#中是否有一種方法可以在運行時調用對象的方法。
類似的東西(我知道這行不通,但我認為它可以更好地表達我想要完成的工作):
if(myObject.Functions["DoStuff"] != null){
myObject.executeFunction("DoStuff");
}
這是可能嗎??
通過反射是可能的,例如:
uses System.Reflection
....
public void ExecuteMethod(object thing, string method)
{
Type type = thing.GetType(); //gets the runtime type of the object
MethodInfo mi = type.GetMethod(method); // null if method not found
mi.Invoke(thing, null); //invokes the method on the "thing" object,
//passing null arguments, and returns the result
}
但是,在您的方案中,最好(如果可能)創建一個具有DoStuff
方法的接口IDoStuff
,並使所有可能被調用來執行操作的類都實現它。
這樣,您的代碼將更簡單,並且不易出錯,如下所示:
public void ExecuteDoStuff(object thingy)
{
if (thingy is IDoStuff)
((IDoStuff)thingy).DoStuff();
else
throw new Exception("thingy cannot do stuff");
}
好吧,在C#4中,您可以編寫:
dynamic d = myObject;
d.DoStuff();
如果無法綁定DoStuff()
方法,則將引發異常,但僅在執行時檢查綁定。
找出是否不僅僅這樣做就行得通是比較棘手的-當然,您總是可以捕捉到例外,但這並不理想。
您可以嘗試通過反思來找到它,但是同樣,我也不認為這是一種創意方法。
更大的問題是,為什么抽象類至少在抽象方法中沒有 DoStuff
方法。 這將是一個更好的解決方案。
如果僅某些子類具有DoStuff
方法,則最好將其放入接口中:
public interface IStuffable
{
void DoStuff();
}
然后,使適當的子類實現IStuffable
,您可以編寫:
IStuffable stuffable = myObject as IStuffable;
if (stuffable != null)
{
stuffable.DoStuff();
}
有幾種方法可以這樣做。 我從推薦的那些開始:
創建一個包含DoStuff()
方法的接口,並在所有類中實現該接口。 然后將對象投射到該接口:
interface IDoStuff { void DoStuff(); } // call it on your object ((IDoStuff)object).DoStuff();
擴展基類以包含DoStuff()
方法(如果可能)
使用反射調用方法:
object.GetType().GetMethod("DoStuff").Invoke();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.