在运行时将列表项转换为泛型类型

时间:2015-02-08 05:44:47

标签: c# generics

我有以下界面:

interface IStorage
{ }

然后我有一个派生自此接口的类(通用),例如,带有属性Get

public class ManagingModel<T> : IStorage
{
    public Func<T> Get { get; set; }
}

要获得这些对象的列表,请使用List<IStorage>

问题是,如何将列表中的项目转换为ManagingModel<>以访问此属性?

2 个答案:

答案 0 :(得分:2)

例如,您可以按索引访问列表元素。例如:

    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;

答案 1 :(得分:1)

由于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();
        }
    }
}