泛型属性-带有任何泛型参数的列表
本文关键字:泛型 参数 列表 任何 属性 | 更新日期: 2023-09-27 18:06:12
我需要实例化一个list-property,其中泛型类型可以是任何类型
所以我的Main
-方法看起来像这样:(实际上,ParsingObject<T>
是我从服务中获得的对象)
public static void Main()
{
Parser parser = new Parser();
parser.AddAnObject(
new ParsingObject<int>{PropertyName = "FirstProperty", Active=true, DefaultValue=1}
);
parser.AddAnObject(
new ParsingObject<bool>{PropertyName = "SecondProperty", Active=false, DefaultValue=false}
);
parser.Parse();
}
ParsingObject
获得任何类型(我认为只有字符串,bool, int,…)作为通用。现在,在我的解析器中,我需要将此对象添加到List<ParsingObject<T>>
中,如:
public class Parser
{
private readonly List<ParsingObject<T>> _listOfObjects = new List<ParsingObject<T>>();
public void AddAnObject<T>(ParsingObject<T> item)
{
_listOfObjects.Add(item);
}
public void Parse()
{
foreach(var item in _listOfObjects.Where(w=>Active))
{
DoSomething(item);
}
}
}
,但我知道,我不能设置T
作为泛型参数实例化列表时(编译器哭..)。所以我可以用ArrayList
来解决这个问题,但是我无法访问每个对象的属性。(参见Parse()
-method)
为完整起见,下面是我的ParsingObject<T>
-class:
public class ParsingObject<T>
{
public string PropertyName { get; set; }
public bool Active { get; set; }
public T DefaultValue { get; set; }
}
你知道我该怎么解决这个问题吗?我不能修改ParsingObject<T>
-class
取决于你的最终目标是什么,也许像这样的东西就足够了:
public class ParsingObjectBase
{
public string PropertyName { get; set; }
public bool Active { get; set; }
public Type ValueType { get; protected set; }
public object DefVal { get; protected set; }
}
public class ParsingObject<T> : ParsingObjectBase
{
public object DefaultValue
{
get { return (T)DefVal; }
set { DefVal = value; }
}
public ParsingObject()
{
ValueType = typeof(T);
}
}
private readonly List<ParsingObjectBase> _listOfObjects = new List<ParsingObjectBase>();
public void AddAnObject<T>(ParsingObject<T> item)
{
_listOfObjects.Add(item);
}
public void Parse()
{
foreach(var item in _listOfObjects.Where(w=>w.Active))
{
DoSomething(item); //do what exactly?
}
}
显然,在这种情况下,您不能不转换为具体的ParsingObject<T>
或DefVal
值,但是您将Type
信息存储在一个地方并可以访问您的特定属性。也许将ValueType
更改为enum
将更容易与switch
一起使用?