2010-12-06 46 views
4

我需要設計一個類可以容納任意數量的類型,雖然我不知道在設計時這些值的類型和數量。例如 - 我可以用2個整數和一個長整數或者1個整數值初始化這個類。我也想盡可能避免拳擊(使用'對象'類型)。每種類型也有一個名字,所以保存的值的內部字典可能看起來像類型設計未知數類型參數

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

和構造可能看起來像

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

我可以構建這樣

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

任何關於更有效的設計的建議,儘可能避免拳擊。

編輯:也應該可以指定一個'字符串'值作爲參數。我最初只提到了Value類型,但事實並非如此!

+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");