包含任何泛型参数的泛型属性列表

时间:2016-09-07 11:19:21

标签: c# generics

我需要实例化一个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> - 类。

1 个答案:

答案 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一起使用?