gpt4 book ai didi

c# - 从通用类型中检索数据

转载 作者:行者123 更新时间:2023-11-30 17:39:40 26 4
gpt4 key购买 nike

我有以下接口(interface),可以通过自定义控件和表单实现:

public interface IThemeable<T> where T : ITheme
{
T Theme { get; set; }

void ChangeTheme(); // Calls ThemeChangedEvent
}

ITheme 是所有主题继承自的接口(interface):

public interface ITheme : ICloneable
{
Color ThemeColor { get; set; }
}

我希望IThemeable组件能够继承Parent主题的ThemeColor,如果Parent也是一个IThemeable,所以我做了一个接口(interface)提供此功能:

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

关于c# - 从通用类型中检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35223712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com