2016-12-15 89 views
0

我想在同一個集合中保存不同類型的對象,但無法解決問題。如何在c#中的集合中保存不同類型的對象?

public class SetupStep 
{ 
    public ObservableCollection</*Picture- or ParameterContaienr*/> Containers {get; set;} 
} 

public class PictureContainer 
{ 
    public ObservableCollection<Picture> Content {get; set;} 
} 

public class ParameterContainer 
{ 
    public ObservableCollection<Parameter> Content {get; set;} 
} 

我認爲這將是通過接口和仿製藥可解,但我還沒有找到一個有效的解決方案爲止。 最後,容器集合將被綁定到WPF中的ScatterView的ItemsSource,它應該顯示具有不同內容的單個容器。

+0

'的ObservableCollection '適用於任何物品類型。數據模板解析和綁定到單個項目的屬性仍然有效,因爲它是通過反射完成的。 – Clemens

+0

這一切都取決於您是否需要在將Container集合添加到集合後操作Containers集合的元素,即如果您需要設置其屬性或調用其方法後才能處理這個問題。如果不是,則不需要接口或泛型,只需將元素存儲在'ObservableCollection '中。 – Clemens

回答

3

讓他們實現相同的接口:

public interface IContainer 
{ 
    // common properties 
} 

public class Picture: IContainer 
{ 
    // prop 
} 

public class Parameter: IContainer 
{ 
    //prop 
} 

public class SetupStep 
{ 
    public ObservableCollection<IContainer> Containers {get; set;} 
} 

這裏如何填寫您的收藏:

SetupStep step = new SetupStep(); 
step.Containers = new ObservableCollection<IContainer>(); 

Parameter p = new Parameter(); 
Picture pic = new Picture(); 

step.Containers.Add(p); 
step.Containers.Add(pic); 
+0

或者使用這樣一個事實,即所有對象派生自Object –

+0

@DmitryOgurtsov這可能不是一個好主意,因爲您需要在此之後投射對象。使用您的通用界面,您可以使用通用屬性和方法。如果使用Object,則需要將對象轉換爲Picture或Parameter以正確使用它們。這會導致代碼混亂,這是ArrayList(存儲對象)過時的主要原因之一。 – mybirthname

+1

@mybirthname從這個問題看來,「容器集合將綁定到WPF中的ScatterView的ItemsSource,它應該顯示具有不同內容的單個容器」,即僅查看,無需操作。 – Clemens

0

您還可以使用通用的解決這個問題

public interface BaseContainer 
{ 
    // common properties 
} 

public class Picture : BaseContainer 
{ 

} 

public class Parameter : BaseContainer 
{ 

} 
interface SetupStep<T> where T:BaseContainer 
{ 
    ObservableCollection<T> Containers { get; set; } 
} 

public class PictureContainer:SetupStep<Picture> 
{ 

    public ObservableCollection<Picture> Containers { get; set; } 
} 

public class ParameterContainer : SetupStep<Parameter> 
{ 
    public ObservableCollection<Parameter> Containers { get; set; } 
} 
相關問題