我有一个从抽象超类继承的类家族,它由两个具体类实现:
public abstract class AbstractFoo
{
protected static string fooName = "Reset me!";
public static string GetName()
{
return fooName;
}
}
然后像这样构造子类
public class BarFoo : AbstractFoo
{
static BarFoo()
{
fooName = "Pretty Name For BarFoo";
}
}
等等。
我想获取所有AbstractFoo
实现的漂亮名称的列表,以便用户可以决定使用哪个实现。
我的反射代码看起来像
Type fooType = typeof(AbstractFoo);
List<Assembly> assemblies = new List<Assembly>(AppDomain.CurrentDomain.GetAssemblies());
IEnumerable<Type> allTypes = assemblies.SelectMany<Assembly, Type>(s => s.GetTypes());
IEnumerable<Type> fooTypes = allTypes.Where(p => p.IsSubclassOf (fooType));
foreach (Type thisType in fooTypes)
{
MethodInfo method = thisType.GetMethod ("GetName", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
string name = (string) method.Invoke (null, null);
// add to the list, anyhow names.Add (name);
}
我最终method.Invoke
总是返回“重命名我”而不是个人名称。
我很确定我在这里做了一些愚蠢的事情,但我不太确定是什么。