我需要一种使用泛型调用在表单上设置属性的方法。我有一个静态类,它创建一些单例形式,一个主要形式(MDI)使调用和类负责调用,知道显示,打开等。
直到我意识到我需要在表单上设置属性的那一刻,一切都很顺利。我可以这样做,但我希望分配在表单加载之前发生。
我找到了实现这个目标的方法,至少我认为我有一个很酷的想法,但是......让我们看看代码:
public interface IFormBase
{
Action<IFormBase> SetParameters { get; set; }
}
public class FormBase : Form, IFormBase
{
public Action<IFormBase> SetParameters { get; set; }
protected override void OnLoad(EventArgs e)
{
if (SetParameters != null)
{
SetParameters.Invoke(this);
}
base.OnLoad(e);
}
}
...稍后在FormManager静态类...
public TResult GetSingleTonForm<TResult, T>(object state, Action<T> setParameters)
where TResult : FormBase
where T : IFormBase
{
Type t = typeof(T);
FormBase f = null;
if (f == null)
{
f = (FormBase)Activator.CreateInstance(t);
}
if (setParameters != null && f is IFormBase)
{
f.SetParameters = setParameters;
}
return (TResult)f;
}
...
问题:
无法隐式将
System.Action<T>
类型转换为System.Action<blabla.IFormBase>
我理解错误,我正在寻求帮助,以便详细说明不同的解决方案! 谢谢!
答案 0 :(得分:0)
怎么样:
public T GetSingleTonForm<T>(object state, Action<T> setParameters)
where T : FormBase, IFormBase
{
Type t = typeof(T);
FormBase f = null;
if (f == null)
{
f = (FormBase)Activator.CreateInstance(t);
}
if (setParameters != null && f is IFormBase)
{
setParameters.Invoke((T)f);
}
return (T)f;
}
它确实编译,我认为它可以满足您的需求。这样,您OnLoad
也不需要FormBase
来电。