通用操作呼叫分配问题

时间:2012-10-11 16:30:16

标签: c# winforms generics delegates

我需要一种使用泛型调用在表单上设置属性的方法。我有一个静态类,它创建一些单例形式,一个主要形式(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>

我理解错误,我正在寻求帮助,以便详细说明不同的解决方案! 谢谢!

1 个答案:

答案 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来电。