簡體   English   中英

在運行時將列表項轉換為通用類型

[英]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.

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