泛型属性-带有任何泛型参数的列表

本文关键字:泛型 参数 列表 任何 属性 | 更新日期: 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一起使用?