在泛型类型未知时将对象转换为泛型类
问题描述:
在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将是什么呢?
答
你不能。通常的解决办法是这样的:
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和不论其具体的泛型类型的得到他们的属性。
(也许你的问题存在不是使用泛型类型这在所有其他一些,更简单的解决办法,但我会留给别人拿出。)
有没有你不使用的理由派生类/接口? – 2010-08-05 17:18:19