2010-12-06 6 views
4

Мне нужно создать класс, который может содержать произвольное количество типов, хотя во время разработки я не знаю тип и количество этих значений. Например, я мог бы инициализировать класс с 2 ints и длинным или всего одним значением int. Я также хотел бы избежать бокса, насколько это возможно (используя тип «объект»). Каждый тип также будет иметь имя, поэтому внутренний словарь, содержащий значения, может выглядеть следующим образомКонструкция класса для неизвестного числа параметров типа

Dictionary<string,object> nameValues;//Boxing! 

и конструктор может выглядеть

MyClass(params object[] values) { ... } 

Я мог бы построить экземпляр, как это

MyClass mc = new MyClass("intVal",3,"doubleVal",3.5,"dateTimeVal",DateTime.Now); 

Любые предложения по более эффективному дизайну, которые могли бы избежать бокса, насколько это возможно.

Редактировать: Должно быть возможно также указать значение «string» в качестве параметра. Первоначально я упоминал только типы значений, но это уже не так!

+0

Я не понимаю, как вы можете сделать это без используя бокс. С другой стороны, если вы сообщите нам, что вы хотите сделать, кто-то может придумать лучшее решение. – decyclone 2010-12-06 10:07:57

+0

есть ли какой-либо предел для параметров типа значения, т. Е. 2,3,4,5 – TalentTuner 2010-12-06 10:15:36

+0

@decyclone На самом деле я действительно хочу достичь того, что я сказал, - создать эффективный контейнер для произвольного количества типов значений, где каждый тип значения имеет ассоциированное имя , – alwayslearning 2010-12-06 10:17:44

ответ

2

Лично я не боюсь небольшого бокса; если вы не профилировали и не доказали, что это проблема, это, вероятно, наименее из ваших проблем. Но как насчет Анон типа:

var mc = new { intVal = 3, doubleVal = 3.5, dateTimeVal = DateTime.Now }; 

Единственная проблема заключается в том, что вне этого метода единственный способ, чтобы получить эти значения обратно осуществляется с помощью отражения. Который не обязательно проблема. Но во многих отношениях Dictionary<string,object> (при избыточном весе) намного проще.

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

Если вы заранее знаете, возможные типы, вы можете использовать отдельный словарь для каждого типа, то вам не нужно бокс при чтении значения обратно.

Например, используя существующую структуру кода:

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); 
     } 
    } 
} 
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"); 
Смежные вопросы