2011-06-05 124 views
2

我有一個類我可以創建一個清單<Class<T>>嗎?

public class Setting<T> 
{ 
    public string name { get; set; } 

    public T value { get; set; } 
} 

現在我想創建一個IList<Setting<T>>但在它不同類型Setting<T>式T的,我想如

List<Setting<T>> settingsList; 
settingsList.Add(new Setting<int>()); 
settingsList.Add(new Setting<string>()); 

我試過IList<Setting<T>>但這似乎不可能的,因爲編譯器沒有找到T類型。

我知道我可以使用對象,但我希望它是強類型。所以我的問題是,如果有可能得到這個工作。

+0

您的意思是,例如,您有'設置'和'設置',並且您想要包含這兩個列表? – BoltClock 2011-06-05 10:05:20

+0

相關問題C# - 多個泛型類型在一個列表中(http://stackoverflow.com/questions/353126/c-multiple-generic-types-in-one-list) – bentayloruk 2011-06-05 10:08:01

+0

@BoltClock編輯我的問題,使其更多清除 – Tokk 2011-06-05 10:13:14

回答

9

默認情況下,泛型類型在具體定義中沒有公共類型或接口。

您的Setting<T>類是否實現了一個接口(或從普通類派生)並創建該接口(或類)的列表。

public interface ISetting { } 

public class Setting<T> : ISetting 
{ 
    // ... 
} 

// example usage: 
IList<ISetting> list = new List<ISetting> 
{ 
    new Setting<int> { name = "foo", value = 2 }, 
    new Setting<string> { name = "bar", value "baz" }, 
}; 
+0

+1您可以添加'public string name {get;組; }'以'ISetting'清楚地表明通用接口只能實際包含所有繼承類中具有共同簽名的操作。 – 2011-06-05 10:18:32

0

您必須爲放入列表中的所有類類型使用共同的祖先類。如果它應該是任意類型,則必須使用object for T

0

您可以使用T只有你的類中:

class Setting<T> 
{ 
    // T is defined here 
} 

不在外面。外,您需要指定具體類型:

Settings<string> stringSettings = new Settings<string>(); 

List<Settings<string>> list = new List<Settings<string>>(); 
list.Add(stringSettings); 
0

你們可以通過使用反射 做,我寫了這樣的代碼另一個問題,但你可以使用這個

public abstract class GenericAccess 
{ 
    public static IList<T> GetObjectListFromArray<T>(T item) 
    { 
     var r = new List<T>(); 
     var obj = typeof(T).Assembly.CreateInstance(typeof(T).FullName); 
     var p = obj.GetType().GetProperty("Id", System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); 
     if (p != null) 
     { 
      p.SetValue(obj, item, null); 
      var m = r.GetType().GetMethod("Add"); 
      m.Invoke(r, new object[] { obj }); 
     } 
     return r; 
    } 
} 

並且這樣稱呼它

IList<int> r = GenericAccess.GetObjectListFromArray<int>(1); 
相關問題