如何创建未知值类型的字典对象列表?

时间:2014-11-03 18:52:40

标签: c# generics design-patterns

我正在创建一个包含各种类型信息的CInformation类。它将公开的一种信息是Parameters。可以使用以下任何类型键入每个参数:intshortstring。此外,任何parameter都可能基于string键具有多个可能的值。所以我想创建一个Dictionary<string, T>来保存参数的所有可能值,但是当我尝试声明我的Parameters列表时会出现问题。我创建了以下类:

public class CParameter<T>
{ 
    public object ParameterType { get; set; }

    public Dictionary<string,T> ValueByString;
}

public class CInformation
{
    public string Version { get; set; }

    public string Name{ get; set; }

    public List<CParameter<object>> Parameters; // cannot cast any of my types to object, obviously!
}

我有什么建议可以解决我的问题吗?我对我的问题采取不同的解决方案,不一定与上面的设计相同。谢谢。

编辑:我想要实现的主要功能是能够拥有不同值类型的词典列表。

1 个答案:

答案 0 :(得分:1)

使用object来专门化泛型类型是相当可疑的。如果你这样做,你甚至可能根本不使用泛型类型。 : - )

我认为这里的问题是您希望CParameter<T>的实例专门针对不同的参数类型,并且您希望CInformation类上的参数列表包含不同类型的{{1} }}

换句话说:

CParameter<T>

请注意,该示例中的namespace Scratch { class Program { static void Main(string[] args) { CParameter<int> ints = new CParameter<int>(); CParameter<long> longs = new CParameter<long>(); CInformation info = new CInformation(); info.AddParameter(ints); info.AddParameter(longs); CParameter<int> ints2 = info.GetParameter<int>(); // ints2 and ints will both refer to the same CParameter instance. } } public class CParameter<T> { public Type ParameterType { get { return typeof(T); } } public Dictionary<string, T> ValueByString; } public class CInformation { public string Version { get; set; } public string Name { get; set; } private List<object> parameters; public CInformation() { this.parameters = new List<object>(); } public void AddParameter<T>(CParameter<T> parameter) { this.parameters.Add(parameter); } public CParameter<T> GetParameter<T>() { foreach (object parameter in this.parameters) { if (parameter is CParameter<T>) return (CParameter<T>)parameter; } throw new Exception("Parameter type " + typeof(T).FullName + " not found."); } } } 也可以是List<object>

另外,我有一种预感,你想要按名称而不是按类型检索那些ArrayList对象。因此,请考虑向CParameter添加Name属性,并为CParameter方法添加name参数。然后遍历列表以查找具有正确名称的属性。在返回结果之前转换结果将验证该类型是您期望的类型。

或者更好的是,将参数存储在GetParameter而不仅仅是列表中,并使用参数名作为键。