【问题标题】:Invoke abstract class method using reflection c#使用反射c#调用抽象类方法
【发布时间】:2016-12-12 18:07:58
【问题描述】:

我的外部 dll 设计如下:

class Engineering
{
   ProjectsCollection project {get;}
}

abstract class ProjectsCollection
{
   public abstract Project Open(string path);
}

我可以继续,直到获得方法信息

MethodInfo info = type.GetMethod("Open");

如何调用“Open”方法?

【问题讨论】:

  • 您尝试使用哪个类来调用该方法?您需要一个为方法 Open 提供实现的类型的实例。抽象方法在ProjectsCollection 中没有实现。你有继承自ProjectsCollection 的类吗?如果是,则显示它。如果否,则不能调用该方法。
  • 进一步阅读您已经阅读的内容以了解GetMethod。我敢打赌,同一个资源有一个关于调用接收成员的章节。顺便说一句:无论您的方法是否抽象,都没有区别,因为您需要一个实际的 instance 类型。由于您无法创建抽象类的实例,因此您必须创建一个子类并调用此实例上的方法。
  • 为什么这个方法被标记为 C# 和 Java? Dynamic顺便说一句。我猜这毫无意义。

标签: c# .net dynamic reflection


【解决方案1】:

反射与否,你不能调用抽象方法,因为没有什么可以调用的。当然,你可以写

info.Invoke(eng.project, new object[] {path});

但除非将eng.project 设置为来自ProjectCollection 的非抽象类后代的对象,否则它将引发异常,该对象实现Open 方法:

class ProjectsCollectionImpl : ProjectsCollection {
    public Project Open(string path) {
        return ...
    }
}

Engineering eng = new Engineering(new ProjectsCollectionImpl());
MethodInfo info = type.GetMethod("Open");
var proj = info.Invoke(eng.project, new object[] {path});

【讨论】:

    【解决方案2】:

    只需拨打Invoke

    info.Invoke(someObject, new object[] {"This is the parameter of the method"});
    

    就这么简单!

    Invoke 的返回值将是Open 的返回值,它应该是一个Project 对象。

    来自文档:

    使用指定的参数调用当前实例表示的方法或构造函数。

    哦,您应该知道上面的someObject 是您正在调用该方法的对象。您应该始终使其成为具体类的实例!不要给它null

    【讨论】:

    • 如果我们调用静态方法,它可以是 NULL
    • @user3185569 这里的Open方法显然不是静态的。
    • 你用了always这个词,可以理解为不应该以其他方式做的事情。
    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    相关资源
    最近更新 更多