【问题标题】:.net - invoke methods from classes from a certain namespace via reflection.net - 通过反射从某个命名空间的类中调用方法
【发布时间】:2010-03-14 16:45:40
【问题描述】:

SPL 和 PHP 允许您从满足特定条件的类动态创建对象,例如实现特定接口和类似的东西。

但是,我想在 c# 中做类似的事情,并自动从命名空间中的所有类创建对象,并从那些实现特定接口的类中调用特定方法。

我开发桌面应用程序的经验非常有限。我不太确定是否应该使用委托来存档,或者反射是否真的是要走的路。

【问题讨论】:

  • 什么版本的 .NET?询问是因为 4.0 支持动态对象。

标签: c# .net reflection


【解决方案1】:

你必须使用反射——你可能使用委托,但这并不完全清楚;这取决于你在做什么。

Assembly.GetTypes() 将返回程序集中的所有类型;您可以使用Type.IsAssignableFrom() 检查一个类型是否实现了一个接口或派生自另一个特定类型,Type.Namespace 检查命名空间等。Activator.CreateInstance() 将通过调用无参数构造函数创建一个类型的实例(如果有) 或者您可以使用CreateInstance 的其他重载或通过首先使用Type.GetConstructors() 获取它来调用带有参数的构造函数。

如果您已经测试了一个类型是否实现了一个接口,那么在构造一个实例之后,您可以将引用强制转换为该接口,并在该接口内调用方法,而无需使用任何反射。如果您在执行时只知道方法的名称,那么您需要调用Type.GetMethod() 来获取MethodInfo,然后调用Invoke() 来调用它。

当然,所有这些都有些容易出错和复杂 - 如果你能找到任何方法来保持静态类型,那会让你的生活更轻松。这里的大局是什么?你想达到什么目的?

【讨论】:

    【解决方案2】:

    我不确定您为什么要实例化类中每种类型的实例,但您可以使用反射来实现。此外,实例化程序集中的每种类型比实例化命名空间中的每种类型更容易。不管怎样,这里有一个你可以做的例子:

    var assembly = Assembly.GetExecutingAssembly(); //here you would retrieve the assembly you wish to search.
    
    foreach ( var type in assembly.GetTypes() )
    {
        if ( type.GetInterface( "IMyInterface", true ) != null )
        {
            var instance = Activator.CreateInstance( type ) As IMyInterface;
            instance.MethodIWantToCall();
        }
    }
    

    【讨论】:

      【解决方案3】:

      以下代码将查找所有实现 IDisposable 并位于某个命名空间下的类型。如果类型是 Form,则调用 ShowDialog 方法。

              Type[] types = System.Reflection.Assembly.GetExecutingAssembly().GetTypes();
              foreach (Type type in types)
              {
                  if (type.Namespace.Equals("TestApp") &&
                      (type.GetInterface("System.IDisposable") != null))
                  {
                      object obj = Activator.CreateInstance(type);
                      if (obj is Form)
                          ((Form)obj).ShowDialog();
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 2016-11-13
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-02
        • 2013-01-08
        • 2021-01-06
        相关资源
        最近更新 更多