我有一个公共抽象类Client
,其中包含两个继承类Customer
和TimeWaster
。
我在C# Windows Forms
上创建了一个下拉菜单,我想将这两个类名显示为选项:Customer& TimeWaster。
我能想到的只是创建一个包含这两个术语的简单List
,然后将列表绑定到组合框DataSource
:
List<string> clientType = new List<string>()
{
"Customer",
"TimeWaster"
};
public frmClientScreen()
{
cmboxClientType.DataSource = clientType;
}
但这不可维护,因为将来我可能会添加许多其他类,我希望在下拉菜单中显示其名称。
如何将Visual Studio Solution
中的班级名称与组合框显示的项目相关联?
答案 0 :(得分:3)
获取已知类型集的类型名称:
List<string> clientType = new List<string>()
{
nameof(Customer),
nameof(TimeWaster)
};
public frmClientScreen()
{
cmboxClientType.DataSource = clientType;
}
至于动态获取从特定类型派生的所有类型,此question显示了如何执行此操作的示例。
根据该问题的接受答案:
var listOfBs = (from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
from assemblyType in domainAssembly.GetTypes()
where typeof(B).IsAssignableFrom(assemblyType)
select assemblyType).ToArray();
B
应该替换为您的基类。
然后,在获取派生类型列表后,您可以执行以下操作:
var clientTypes = listOfBs.Select(x => x.Name).ToList();
答案 1 :(得分:2)
我必须在很多不同的时间做到这一点,我只想要一个我可以使用的全局函数。所以我清理了一些常见的代码并最终:
public static class ReflectionHelper
{
public static List<T> GetAllNonabstractClassesOf<T>()
{
Object[] args = new Object[0];
return GetAllNonabstractClassesOf<T>(args);
}
public static List<T> GetAllNonabstractClassesOf<T>(Object[] args)
{
List<T> retVal = new List<T>();
IEnumerable<object> instances = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.IsSubclassOf(typeof(T)) && !t.IsAbstract
select Activator.CreateInstance(t, args) as object;
foreach (T instance in instances)
{
retVal.Add(instance);
}
return retVal;
}
}
...然后,你可以简单地调用这样的代码:
List<myClass> = ReflectionHelper.GetAllNonabstractClassesOf<myClass>();
(或者如果你的类需要构造函数参数,你可以使用第二个函数。)
无论如何,它的美妙之处在于,无论您希望反映多少个不同的类,您只需要通过代码执行此功能。