从泛型类型检索数据

本文关键字:数据 检索 泛型类型 | 更新日期: 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本身,原因有两个:

  1. 使用设计器更改主题。他们还使用编辑器来更改主题。如果使用ITheme,设计人员将无法确定正在使用的实现主题。

  2. 代码需要了解有关主题的更多信息才能正确呈现组件,因为每个主题都有自己独特的属性(例如,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);