相关疑难解决方法(0)

WinForm UserControl的通用基类

我为WinForm UserControl创建了一个通用基类:

public partial class BaseUserControl<T> : UserControl
{
    public virtual void MyMethod<T>() 
    { 
        // some base stuff here 
    }
}
Run Code Online (Sandbox Code Playgroud)

以及基于以下内容的UserControl:

public partial class MyControl : BaseUserControl<SomeClass>
{
    public override void MyMethod<SomeClass>() 
    { 
        // some specific stuff here 
        base.MyMethod<SomeClass>();
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但MyControl无法在VisualStudio Designer中进行编辑,因为它表示无法加载基类.我试图定义另一个类BaseUserControl,非泛型,希望它会加载它,但这个技巧似乎不起作用.

我已经有一个解决方法:定义一个接口,IMyInterface <T>,然后创建我的控件

public partial class MyControl : UserControl, IMyInterface<SomeClass>
Run Code Online (Sandbox Code Playgroud)

但是我失去了我的基本虚拟方法(不是很重要,但仍然......).

有没有办法为UserControl创建基础泛型类,有可能在VisualStudio Designer中编辑它?

c# visual-studio-2008 winforms

37
推荐指数
2
解决办法
1万
查看次数

Visual Studio设计器中的抽象UserControl继承

abstract class CustomControl : UserControl 
{
    protected abstract int DoStuff();
}

class DetailControl : CustomControl
{
    protected override int DoStuff()
    { 
        // do stuff
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在表单中删除了一个DetailControl.它在运行时正确呈现,但设计器显示错误并且无法打开,因为基本用户控件是抽象的.

目前,我正在考虑以下补丁,这对我来说似乎很不对,因为我希望子类被强制实现该方法.

class CustomControl : UserControl 
{
    protected virtual int DoStuff()
    {
        throw new InvalidOperationException("This method must be overriden.");
    }
}

class DetailControl : CustomControl
{
    protected override int DoStuff()
    { 
        // do stuff
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都有更好的想法如何解决这个问题?

c# user-controls abstract-class winforms

31
推荐指数
3
解决办法
2万
查看次数

继承类的规则

我可以为继承我的基类的类设置规则.例如.Person : BaseClass,我想Person实现iSomeKindOfInterface,如果Person没有实现接口,则不允许继承BaseClass.

我知道这可以在通用基类中进行,您可以执行以下操作

public BaseClass<T>
     where T : iSomeKinfOfInterface
Run Code Online (Sandbox Code Playgroud)

c# inheritance

7
推荐指数
1
解决办法
152
查看次数