我正在创建一个包含各种类型信息的CInformation
类。它将公开的一种信息是Parameters
。可以使用以下任何类型键入每个参数:int
,short
,string
。此外,任何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!
}
我有什么建议可以解决我的问题吗?我对我的问题采取不同的解决方案,不一定与上面的设计相同。谢谢。
编辑:我想要实现的主要功能是能够拥有不同值类型的词典列表。
答案 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
而不仅仅是列表中,并使用参数名作为键。