![](/img/trans.png)
[英]Winforms combobox displaying class names instead of actual object name
[英]ComboBox Items displaying Class Names in a Solution
我有一個公共抽象類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
的類名鏈接到組合框顯示的項目?
要獲取已知類型集的類型名稱:
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.