簡體   English   中英

當通用類型未知時,將對象強制轉換為通用類

[英]Cast an Object to a generic class when the generic type isn't known

在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);
}

如何在不知道T是多少的情況下將對象投射到ThemeResource?

你不能 通常的解決方案是這樣的:

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並獲取其屬性,而不管其具體的泛型類型如何。

(也許您的問題接受了一些根本不比使用泛型類型更簡單的解決方案,但我將其留給其他人提出。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM