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