У меня есть семейство классов, которые наследуют от абстрактного суперкласса, который реализуется с помощью двух конкретных классов:C#, отражение, наследование и статические поля?
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
всегда возвращаются «Переименовать Me», а не отдельные имена.
Я уверен, что я делаю что-то глупое здесь, но я не совсем уверен, что.
Поля и методы 'static' на самом деле не« унаследованы ». Они являются глобальными (-ish) функциями/переменными, пространство имен которых является охватывающим классом, и это пространство имен автоматически доступно в дочерних классах. – millimoose
Справедливо. Я полностью готов переработать, как я храню/получаю имя, пока я могу получить это поведение (проверяя все реализующие классы и собираю список своих «хороших имен».) – Alterscape