簡體   English   中英

執行未投射對象的功能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM