未知数量类型参数的类设计

时间:2010-12-06 10:02:32

标签: c# .net class class-design

我需要设计一个可以容纳任意数量类型的类,尽管我不知道这些值在设计时的类型和数量。例如 - 我可以用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类型,但事实并非如此!

4 个答案:

答案 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");