2014-11-03 104 views
0

我正在創建一個CInformation類,其中將包含各種類型的信息。它將公開的一種信息是Parameters。每個參數可以鍵入以下任何類型:intshortstring。此外,根據string鍵,任何parameter可能有多個可能的值。所以我想創建一個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! 
} 

任何建議,我怎麼能拿我的身邊問題?我打開不同的解決方案來解決我的問題,不一定是我上面的設計。謝謝。

編輯:我想要實現的主要特點是能夠有一個不同值類型的字典列表。

+2

您能否使'C信息'也通用,並使'公開列表>參數;'。我不確定我是否理解了您的問題 – 2014-11-03 18:56:17

+0

您可能還想從'object'將'CParameter.ParameterType'更改爲'T'。 – Michael 2014-11-03 18:58:55

+0

不是真的,因爲'Parameters'列表應該有多個CParameter對象,每個對象都是不同的類型。編輯:是的,你對'ParameterType'是正確的。 – mbadawi23 2014-11-03 19:01:00

回答

1

使用object專門化一個泛型類型是相當可疑的。如果你這樣做,你甚至可以根本不使用泛型類型。 :-)

我覺得這裏的問題是,你希望你的CParameter<T>實例被專門用於不同的參數類型,並且希望在CInformation類的參數列表包含不同類型的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對象的名稱,而不是僅僅通過類型。因此,請考慮將名稱屬性添加到CParameter,併爲GetParameter方法添加一個名稱參數。然後遍歷列表以找到名稱正確的屬性。在返回之前投射結果將驗證該類型是否是您所期望的類型。

或者更好的是,將參數存儲在Dictionary<string,object>而不僅僅是一個列表中,並使用參數名稱作爲關鍵字。

相關問題