在我的表格中,我有这种方法。
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构造函数中的参数。
答案 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;
}