我需要设计一个可以容纳任意数量类型的类,尽管我不知道这些值在设计时的类型和数量。例如 - 我可以用2个int和一个long或只有1个int初始化类。我也想尽可能避免拳击(使用'对象'类型)。每种类型也都有一个名称,因此保存值的内部字典可能看起来像
Dictionary<string,object> nameValues;//Boxing!
,构造函数看起来像
MyClass(params object[] values) { ... }
我可以构建一个这样的实例
MyClass mc = new MyClass("intVal",3,"doubleVal",3.5,"dateTimeVal",DateTime.Now);
关于更有效设计的任何建议,尽可能避免装箱。
编辑:应该可以将'字符串'值指定为参数。我最初只提到了Value类型,但事实并非如此!
答案 0 :(得分:2)
我个人不会害怕小拳击;除非你已经描述并证明这是一个问题,否则这可能是你的问题中最不重要的。但是如何使用anon-type:
var mc = new { intVal = 3, doubleVal = 3.5, dateTimeVal = DateTime.Now };
唯一的问题是在此方法之外,将这些值取回的唯一方法是通过反射。这不是必然问题。但在许多方面,Dictionary<string,object>
(虽然更超重)更简单。
答案 1 :(得分:2)
试试这个
Dictionary<string, ValueType> x = new Dictionary<string, ValueType>();
x.Add("1",1);
x.Add("2", 23.33m);
x.Add("3", new MyStruct());
x.Add("4", new object()); // compile-time error
答案 2 :(得分:2)
如果事先知道可能的类型,可以为每种类型使用单独的字典,然后在读取值时不需要装箱。
例如,使用现有的代码结构:
class MyClass
{
private Dictionary<string, int> intValues = new Dictionary<string, int>();
private Dictionary<string, double> doubleValues = new Dictionary<string, double>();
private Dictionary<string, DateTime> dateTimeValues = new Dictionary<string, DateTime>();
public MyClass(params object[] values)
{
if (values.Length % 2 != 0)
throw new ArgumentException("invalid values!", "values");
for (int i = 0; i < values.Length; i += 2)
{
string key = values[i].ToString();
object value = values[i + 1];
if (value is int)
intValues.Add(key, (int)value);
else if (value is double)
doubleValues.Add(key, (double)value);
else if (value is DateTime)
dateTimeValues.Add(key, (DateTime)value);
}
}
}
答案 3 :(得分:0)
可能类似于下面
public class ValueHolder
{
public ValueType[] Values { get; set; }
public string[] NonValueType { get; set; }
}
public class SomeValueType<T> where T:ValueHolder
{
Dictionary<string, T> tempDict = new Dictionary<string, T>();
public SomeValueType(T val,string keyName)
{
if(!tempDict.Keys.Contains(keyName))
tempDict.Add(keyName, val);
}
}
用途
ValueType[] arr = new ValueType[] { 1, 1.1, DateTime.Now };
ValueHolder vh = new ValueHolder();
vh.Values = arr;
vh.NonValueType = new string[] { "temp", "s" };
SomeValueType<ValueHolder> temp = new SomeValueType<ValueHolder>(vh, "key");