2011-09-21 76 views
1

我正在实现一个Web控件,它使用特定函数获取对象(作为参数) - 我们称之为DoStuff() - 对象可以属于不同的类,这些都是派生自一个抽象类 - 让我们称之为SuperClass - 这个SuperClass没有DoStuff()方法。执行未开发对象的函数

所以我的问题是:是否有一种方法在C#中调用运行时的对象的方法,如果此方法存在于对象中,而不必将其转换为派生类。

喜欢的东西(我知道这不工作,但我认为它表达更好,我想什么来完成):

if(myObject.Functions["DoStuff"] != null){ 
    myObject.executeFunction("DoStuff"); 
} 

这是在所有可能的?

+0

是对象保证有法? – BoltClock

+0

@BoltClock是的,控件只能在类有方法时调用。 – woolagaroo

回答

3

这可能与反思,如:

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 

} 

但是,在你的场景中,创建一个接口IDoStuff将会更好(如果可能),该接口将有DoStuff方法,并使所有可能调用的类实现它。
这样,你的代码会更简单,更容易出错,就像这样:

public void ExecuteDoStuff(object thingy) 
{ 
    if (thingy is IDoStuff) 
     ((IDoStuff)thingy).DoStuff(); 
    else 
     throw new Exception("thingy cannot do stuff"); 
} 
+0

我也喜欢界面解决方案,但是这是不可能的,因为我只是提供控制...所以反射是激动人心的,我一直在寻找;) – woolagaroo

2

那么,在C#4你可以写:

dynamic d = myObject; 
d.DoStuff(); 

这将抛出一个异常,如果DoStuff()方法不能绑定,但是绑定仅在执行时检查

这是相对棘手找出是否这回事不只是在做它的工作 - 你总是可以赶上课程的例外,但它的效果并不理想。

你可以尝试用反射来找到它,但我不认为这是一个想法的方法。

更大的问题是为什么抽象类没有DoStuff方法,至少作为一个抽象方法。那将是一个更好的解决方案。

如果只有子类的一些DoStuff方法,这将是更好地将它放入一个接口:

​​

然后做出相应的子类实现IStuffable,你可以写:

IStuffable stuffable = myObject as IStuffable; 
if (stuffable != null) 
{ 
    stuffable.DoStuff(); 
} 
1

有几种方法可以做到这一点。我开始与那些推荐:

  • 创建界面至极包含您DoStuff()方法的所有的类都实现了。然后投你的对象是接口:

    interface IDoStuff { 
        void DoStuff(); 
    } 
    
    // call it on your object 
    ((IDoStuff)object).DoStuff(); 
    
  • 扩展您的基类来包含DoStuff()方法(如果可能)

  • 使用反射来调用方法:

    object.GetType().GetMethod("DoStuff").Invoke();