2010-08-16 62 views
3

说我有在大会甲基类:确定一个子类的组件,带在基类的方法

public class MyBaseClass{ 
    public static Assembly GetMyAssembly(){ 
    //determine the Assembly of my subclasses 
    } 
} 

然后我创建该类的组件B内的子类:

public class MySubClass : MyBaseClass { 
} 

从那里,在我的领域特定的逻辑我调用MySubClass.GetMyAssembly()。此逻辑可能与MySubClass在同一个程序集中,或者它可能位于单独的程序集中。我如何确定包含调用继承方法的子类的程序集? (不重写它)我试图在System.Reflection中使用不同的Assembly.Get *()方法,但没有任何运气。

+2

如上所述,如果GetMyAssembly实际上是一个**静态**方法,那么代码将不会在您定义它的类之外的任何程序集中执行。另外,由于它是静态的,所以也没有“覆盖”。 MySubClass.GetMyAssembly()会(除非你使用“new”操作符)总是指向MyBaseClass中定义的实现。 – 2010-08-16 13:53:15

回答

1

你不能。这种静态方法确实是确实是住在具有基本类型的程序集中。

您可以做的最好的方法是使用实​​例方法(省略static关键字),以便代码可以访问此引用的。 this.GetType()表达式为您提供派生类型。它的Assembly属性为您提供包含派生类型的程序集。

+0

感谢您的回答以及您的建议,通过实例方法中的GetType()方法而不是静态方法来检索给定类型的子类的程序集。我希望在团队中的其他开发人员可以使用单个静态方法,但还有其他方法可以简化实现。非常感谢你! – wintondeshong 2010-08-16 17:45:35

0

我建议,而不是使用Assembly.Get*()方法,你看看在Type对象本身 - 它有一些非常有用的属性和方法:

this.GetType().BaseType.Assembly; 

如果你正在寻找简单地得到一个特定的基类的汇编,你需要使用typeof(MyBaseClass).Assembly - 因为你的类应该知道它的继承链,我不认为这会是一个问题。

+0

我在等待OP的一些澄清,但这听起来像是他想要相反的解决方案。从基类的上下文中获取所有的子类。如果是这样的话,他将别无选择,只能使用AppDomain.CurrentDomain.GetAssemblies()。 – 2010-08-16 13:55:05

+0

哦,好点。我想我在阅读这个问题时可能没有完全清醒。不过,我希望有一种类似于静态方法的typeof(self),特别是对于可继承类的静态方法。这可能是wintondeshong正在寻找的。 – 2010-08-16 15:52:37

相关问题