簡體   English   中英

ComboBox項目在解決方案中顯示類名稱

[英]ComboBox Items displaying Class Names in a Solution

我有一個公共抽象類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的類名鏈接到組合框顯示的項目?

要獲取已知類型集的類型名稱:

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

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

至於動態獲取從特定類型派生的所有類型,此問題顯示了如何執行此操作的示例。

根據該問題的接受答復:

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

我必須在很多不同的時間做到這一點,我只想要一個我可以使用的全局函數。 所以我清理了一些常見的代碼並最終:

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

(或者如果你的類需要構造函數參數,你可以使用第二個函數。)

無論如何,它的美妙之處在於,無論您想要反映多少個不同的類,您只需要通過代碼執行此功能一次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM