从泛型类型检索数据
本文关键字:数据 检索 泛型类型 | 更新日期: 2023-09-27 18:33:31
我有以下接口,可以通过自定义控件和窗体实现:
public interface IThemeable<T> where T : ITheme
{
T Theme { get; set; }
void ChangeTheme(); // Calls ThemeChangedEvent
}
ITheme
是所有主题继承自的接口:
public interface ITheme : ICloneable
{
Color ThemeColor { get; set; }
}
我希望IThemeable
组件能够继承父主题的ThemeColor
如果父主题也是IThemeable
,所以我做了一个接口来提供这个功能:
public interface IThemeableComponent
{
bool InheritTheme { get; set; }
ITheme ParentTheme { get; set; }
void InitializeTheme();
}
InitializeTheme
内部是我将设置ParentTheme
的地方,因此理想情况下,我想检查组件的父组件是否继承自IThemeable
,如果是,则ParentTheme
设置为父级的主题。但是,由于 IThemeable 需要泛型类型,因此我无法执行此操作:
// Expander.cs - class Expander : ContainerControl, IThemeable<ExpanderTheme>, IThemeableComponent
private bool _inheritTheme;
public bool InheritTheme
{
get
{
return _inheritTheme;
}
set
{
// Check whether the parent is of type IThemeable
_inheritTheme = Parent.GetType().GetGenericTypeDefinition() == typeof (IThemeable<>) && value;
}
}
public ITheme ParentTheme { get; set; }
public void InitializeTheme()
{
Theme = Themes.ExpanderDefault.Clone() as ExpanderTheme;
if (Parent.GetType().GetGenericTypeDefinition() == typeof (IThemeable<>))
{
ParentTheme = (Parent as IThemeable<>).Theme; // Type argument is missing
}
}
有没有办法实现我想要的?或者如果没有,是否有其他方法?
编辑:
最好是 IThemeable 是通用的。实施成员应该有一个特定的主题来扩展ITheme,而不是ITheme本身,原因有两个:
使用设计器更改主题。他们还使用编辑器来更改主题。如果使用
ITheme
,设计人员将无法确定正在使用的实现主题。代码需要了解有关主题的更多信息才能正确呈现组件,因为每个主题都有自己独特的属性(例如,FormTheme 具有
Color ControlBoxHoverColor
(。如果使用ITheme
,我需要将其转换为首选类型,而不是使用如下代码:
-
// ThemedForm.cs - class ThemedForm : Form, IThemeable<FormTheme>
private FormTheme _theme;
[DisplayName("Theme")]
[Category("Appearance")]
[Description("The Theme for this form.")]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
[Editor(typeof(ThemeTypeEditor), typeof(UITypeEditor))]
[TypeConverter(typeof(ExpandableObjectConverter))]
public FormTheme Theme
{
get { return _theme; }
set
{
_theme = value;
ChangeTheme();
}
}
因为
ParentTheme
只是一个ITheme
,所以以下应该可以解决问题:
ParentTheme = (ITheme)Parent.GetType().GetProperty("Theme").GetValue(Parent);