[英]Cast list item to generic type at runtime
我有以下界面:
interface IStorage
{ }
然后我有一個從該接口(通用)派生的類,例如,帶有屬性Get
public class ManagingModel<T> : IStorage
{
public Func<T> Get { get; set; }
}
要獲得這些對象的列表,我正在使用List<IStorage>
問題是,如何將項目從列表強制轉換為ManagingModel<>
以訪問此屬性?
例如,您可以按索引訪問列表元素。 例:
var managingString = new ManagingModel<string>();
var managingInt = new ManagingModel<int>();
var managingDouble = new ManagingModel<double>();
var list = new List<IStorage>();
list.Add(managingString);
list.Add(managingInt);
list.Add(managingDouble);
嘗試通過索引將“ as”轉換為給定模型:
var backToManagingModel = list[1] as ManagingModel<int>;
if (backToManagingModel != null)
{
var get = backToManagingModel.Get;
}
如果強制轉換后backToManagingModel為null,則將其強制轉換為錯誤的類型,否則強制轉換成功,您可以獲取屬性。
編輯:那根本不使用泛型,而只是使用對象呢?
public static string GetString()
{
return "xyz";
}
public interface IStorage
{
Func<object> Get { get; set; }
}
public class ManagingModel : IStorage
{
public Func<object> Get { get; set; }
}
您無需檢查所有類型,只需調用list[index].Get
var managingString = new ManagingModel
{
Get = new Func<string>(GetString)
};
var list = new List<IStorage>();
list.Add(managingString);
var get = list[1].Get;
由於Func<T>
的值用於視圖,因此您可以擴展IStorage
以將其作為Func<object>
。
嘗試這個:
interface IStorage
{
Func<object> Get { get; }
}
public class ManagingModel<T> : IStorage
{
public Func<T> Get { get; set; }
Func<object> IStorage.Get
{
get
{
return () => this.Get();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.