2010-08-05 179 views
0

在Silverlight項目中,我定義了以下類。在泛型類型未知時將對象轉換爲泛型類

public class ThemeResource<T> 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public Type Type { get { return typeof(T); } } 
    public string TypeName { get { return Type.FullName; } } 
    public T Resource { get { return (T)Application.Current.Resources[this.Name]; } } 
} 

有幾個列表在我的代碼隱藏中使用類。

public List<ThemeResource<SolidColorBrush>> BrushResources { get; set; } 
public List<ThemeResource<Color>> ColorResources { get; set; } 
public List<ThemeResource<FontFamily>> FontNameResources { get; set; } 
public List<ThemeResource<Thickness>> ThicknessResources { get; set; } 
public List<ThemeResource<Double>> FontSizeResources { get; set; } 
public List<ThemeResource<Style>> TextStyleResources { get; set; } 

而我的觀點有幾個列表框綁定到列表,像這樣。

<UserControl x:Name="ThemeResourcesPage" ...> 
    <ListBox Style="{StaticResource BrushResourceListBoxStyle}" 
       ItemsSource="{Binding ElementName=ThemeResourcesPage, Path=BrushResources}" 
       SelectionChanged="ListBox_SelectionChanged" /> 
</UserControl> 

我想在我有一個SelectionChanged事件處理程序的代碼隱藏我所有的列表用來顯示有關選擇的ThemeResource細節。我的問題是SelectionChangedEventArgs的AddedItems是一個對象列表,而ListBox上的SelectedItem屬性是一個對象。

這是行不通的:

private void ListBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
{ 
    if (e.AddedItems.Count != 1) 
     return; 

    var tr = (ThemeResource<T>)e.AddedItems[0]; 
    var msg = string.Format("Name: {0}\nType: {1}\nDescription: {2}", 
          tr.Name, tr.TypeName, tr.Description); 
    MessageBox.Show(msg); 
} 

我怎麼投的對象ThemeResource不知道T將是什麼呢?

+0

有沒有你不使用的理由派生類/接口? – 2010-08-05 17:18:19

回答

1

你不能。通常的解決辦法是這樣的:

public interface IThemeResource 
{ 
    public string Name { get; } 
    public string Description { get; } 
    public string TypeName { get; } 
} 

public class ThemeResource<T> : IThemeResource 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public Type Type { get { return typeof(T); } } 
    public string TypeName { get { return Type.FullName; } } 
    public T Resource { get { return (T)Application.Current.Resources[this.Name]; } } 
} 

然後你就可以繞過IThemeResource S和不論其具體的泛型類型的得到他們的屬性。

(也許你的問題存在不是使用泛型類型這在所有其他一些,更簡單的解決辦法,但我會留給別人拿出。)