我有以下界面:
interface IStorage
{ }
然后我有一个派生自此接口的类(通用),例如,带有属性Get
public class ManagingModel<T> : IStorage
{
public Func<T> Get { get; set; }
}
要获得这些对象的列表,请使用List<IStorage>
问题是,如何将列表中的项目转换为ManagingModel<>
以访问此属性?
答案 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();
}
}
}