C# 当泛型类型为';不知道

C# 当泛型类型为';不知道,c#,silverlight,generics,C#,Silverlight,Generics,在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;

在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类主题资源
{
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共类型类型{get{return typeof(T);}
公共字符串类型名称{get{return Type.FullName;}}
公共T资源{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; }
公共列表资源{get;set;}
公共列表颜色资源{get;set;}
公共列表FontNameResources{get;set;}
公共列表厚度资源{get;set;}
公共列表FontSizeResources{get;set;}
公共列表TextStyleResources{get;set;}
我的视图有几个绑定到列表的列表框,如下所示

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

我希望在我的代码中有一个SelectionChanged事件处理程序,我的所有列表都使用它来显示所选资源的详细信息。我的问题是SelectionChangedEventArgs的AddItems是一个对象列表,而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);
}
private void ListBox\u SelectionChanged(对象发送者,System.Windows.Controls.SelectionChangedEventArgs e)
{
如果(e.AddedItems.Count!=1)
返回;
var tr=(ThemeResource)e.AddedItems[0];
var msg=string.Format(“名称:{0}\n类型:{1}\n说明:{2}”,
tr.名称、tr.类型名称、tr.描述);
MessageBox.Show(msg);
}

在不知道T将是什么的情况下,如何将对象强制转换为资源?

您不能。通常的解决方案如下:

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
{
公共字符串名称{get;}
公共字符串描述{get;}
公共字符串类型名{get;}
}
公共类主题资源:IThemeResource
{
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共类型类型{get{return typeof(T);}
公共字符串类型名称{get{return Type.FullName;}}
公共T资源{get{return(T)Application.Current.Resources[this.Name];}
}
然后,您可以传递
IThemeResource
s并获取它们的属性,而不管它们的具体泛型类型如何


(也许您的问题还存在一些比使用泛型类型更简单的解决方案,但我将把它留给其他人来解决。)

您不使用派生类/接口有什么原因吗?