ComboBox项目在解决方案中显示类名称

时间:2017-03-17 15:25:29

标签: c# winforms visual-studio

我有一个公共抽象类Client,其中包含两个继承类CustomerTimeWaster

我在C# Windows Forms上创建了一个下拉菜单,我想将这两个类名显示为选项:Customer& TimeWaster。

我能想到的只是创建一个包含这两个术语的简单List,然后将列表绑定到组合框DataSource

List<string> clientType = new List<string>()
{
    "Customer",
    "TimeWaster"
};

public frmClientScreen()
{
    cmboxClientType.DataSource = clientType;
}

但这不可维护,因为将来我可能会添加许多其他类,我希望在下拉菜单中显示其名称。

如何将Visual Studio Solution中的班级名称与组合框显示的项目相关联?

2 个答案:

答案 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>();

(或者如果你的类需要构造函数参数,你可以使用第二个函数。)

无论如何,它的美妙之处在于,无论您希望反映多少个不同的类,您只需要通过代码执行此功能。