有一些方法可以使用泛型在運行時強制類型化屬性,但我不確定它是多麼有用。這裏是一個解決方案兩種方式:
創建一個不強類型,以方便與對象交互的接口:
public interface IDataGridColumnData
{
object SearchColumnAsObject { get; set; }
object ResultColumnAsObject { get; set; }
}
創建通用類,允許在運行時創建強類型的版本(和代碼以及,當然),並實現該接口:
public class DataGridColumnData<TSearch, TResult> : IDataGridColumnData
{
public TSearch SearchColumn { get; set; }
public static TResult ResultColumn { get; set; }
public object SearchColumnAsObject
{
get { return SearchColumn; }
set { SearchColumn = (TSearch)value; }
}
public object ResultColumnAsObject
{
get { return ResultColumn; }
set { ResultColumn = (TResult)value; }
}
}
創建一個工廠方法,將製造類的強類型版本,它返回的類型對象的接口:
private static IDataGridColumnData GetDataGridColumnData(
Type searchType, Type resultType)
{
var typedColumnDataType = typeof(DataGridColumnData<,>)
.MakeGenericType(new[] { searchType, resultType });
return (IDataGridColumnData)Activator.CreateInstance(typedColumnDataType);
}
...並把它用:
IDataGridColumnData instance = GetDataGridColumnData(
Type.GetType("System.Int32"),
Type.GetType("System.String"));
// use the properties
instance.SearchColumnAsObject = 42; // works well
instance.SearchColumnAsObject = "42"; // throws exception
如何做你想要的用戶後使用此選擇類型?你想過濾一些數據嗎? –
Ditto Wouter的評論 - 這些類型在編譯時最有用。在運行時,它不會有太大的區別。也就是說,你總是可以定義一個通用的包裝類DataGridColumnData,它繼承自另一個類,並用類型訪問器包裝訪問器,然後定義新的實例。但我不確定你會用那些你無法用對象版本來做的事情。 – Rup
這些屬性將用於在DataGridView中創建列。並且從數據庫中提取的數據將存儲在綁定到DataGridView的List中,因此我可以使用這些屬性將數據庫數據轉換爲用戶選擇的類型。 – user850010