我需要实例化一个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()
- 方法)
为了完整性,这是我的ParsingObject<T>
- 类:
public class ParsingObject<T>
{
public string PropertyName { get; set; }
public bool Active { get; set; }
public T DefaultValue { get; set; }
}
知道如何解决这个问题吗?我无法修改ParsingObject<T>
- 类。
答案 0 :(得分:1)
根据您的最终目标究竟是什么,也许这样就足够了:
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
一起使用?