具有参数的泛型类调用

时间:2016-10-27 16:27:38

标签: c#

在我的表格中,我有这种方法。

public void ChangeView<T>() where T : Control, new()
    {
        if (transitionManager1.IsTransition)
        {
            transitionManager1.EndTransition();
        }

        transitionManager1.StartTransition(BasePanel);
        try
        {

            T find = Find<T>(BasePanel);
            if (find != null)
            {
                find.BringToFront();
            }
            else
            {
                find = new T();
                find.Parent = BasePanel;
                find.Dock = DockStyle.Fill;
                find.BringToFront();
            }

        }
        finally
        {
            transitionManager1.EndTransition();
        }
    }

问题是当我尝试从名为userC1的用户控件调用此方法时,该控件在构造函数中具有一些参数,如下所示

Form1 f;
    public UserC1(Form1 f)   
    {
        InitializeComponent();
        this.f = f;
    }

我在表单1中调用方法如下

ChangeView<UserC1>(); 

但是上面的代码是错误的 必须是非抽象类型,使用public parameter less constructor才能在泛型类型或方法中使用它。

我怎样才能摆脱这个问题。 我需要userC1构造函数中的参数。

1 个答案:

答案 0 :(得分:0)

我按如下方式编辑代码,并在我的代码中添加一个接口,如下所示......

T Find<T>(Control container) where T : Control
    {
        for (int i = 0; i < container.Controls.Count; i++)
        {
            if (container.Controls[i] is T)
            {
                return (T)container.Controls[i];
            }
        }
        return null;
    }

public void ChangeView<T>(Func<INavigationControl, T> createTInstance) where T : Control, new()
    {
        if (transitionManager1.IsTransition)
        {
            transitionManager1.EndTransition();
        }

        transitionManager1.StartTransition(BasePanel);
        try
        {

            T find = Find<T>(BasePanel);
            if (find != null)
            {
                find.BringToFront();
            }
            else
            {
                if (createTInstance == null)
                    find = new T();
                else
                    find = createTInstance(this);
                find.Parent = BasePanel;
                find.Dock = DockStyle.Fill;
                find.BringToFront();
            }

        }
        finally
        {
            transitionManager1.EndTransition();
        }
    }




public interface INavigationControl
{
    void ChangeView<T>(Func<INavigationControl, T> createTInstance) where T : Control, new();
}

然后我添加了这段代码来调用我的更改视图方法

ChangeView(form =&gt; new Configurationn(form));

要做到这一点,我们必须编辑构造函数ass。

INavigationControl1 f1;
    public YourForm(INavigationControl1 f1) :this(){
        this.f1 = f1;
    }