方法参数接受多种类型

时间:2015-10-26 06:56:25

标签: c# winforms generics

我正在开发一个应用程序,我在其中获得了多种类型的RichTextBox,我已经定制了(RichTextBox,RichAlexBox,TransparentRichTextBox)

我想创建一个方法来接受所有这些类型以及其他一些参数。

private void ChangeFontStyle(RichTextBox,RichAlexBox,TransparentRichTextBox rch,
                                                         FontStyle style, bool add)
{
  //Doing somthing with rch.Rtf
}

我搜索了StackOverFlow并找到了一些答案like this我无法弄清楚如何使用它们来解决我的问题

void foo<TOne, TTwo>()  //There's just one parameter here
   where TOne : BaseOne //and I can't figure out how to define my other two parameters        
   where TTwo : BaseTwo

我还尝试重载为this answer商品,

private void ChangeFontStyle(TransparentRichTextBox rch, FontStyle style, bool add);
private void ChangeFontStyle(RichAlexBox rch, FontStyle style, bool add);
private void ChangeFontStyle(RichTextBox rch,FontStyle style, bool add)
  {
    //Some codes
  }

但是我遇到了这个错误

'ChangeFontStyle(RichAlexBox, FontStyle, bool)' 
         must declare a body because it is not marked abstract, extern, or partial

这是我检查过的其他一些Q&amp; A:

Generic method with multiple constraints

Can I create a generic method that accepts two different types in C#

C# generic method with one parameter of multiple types

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:5)

假设TransparentRichTextBoxRichAlexBox都是其子类型 RichTextBox,那么您只需要一个方法签名:

private void ChangeFontStyle(RichTextBox rch, FontStyle style, bool add)
{
    //Doing somthing with rch.Rtf
}

否则,您需要为每个重载实现该方法:

private void ChangeFontStyle(TransparentRichTextBox rch, FontStyle style, bool add)
{
    //Some codes
}

private void ChangeFontStyle(RichAlexBox rch, FontStyle style, bool add)
{
    //Some codes
}

private void ChangeFontStyle(RichTextBox rch,FontStyle style, bool add)
{
    //Some codes
}

答案 1 :(得分:5)

如果您正确使用继承,则不需要泛型或重载:

class RichTextBox
{
     // implementation
}

class RichAlexBox : RichTextBox
{
     // implementation
}

class TransparentRichTextBox : RichTextBox
{
     // implementation
}

// allows passing in anything that inherits from RichTextBox
private void ChangeFontStyle(RichTextBox rch, FontStyle style, bool add)
{
     // implementation
}

正如@dotnetkid建议的那样,另一种选择是在RichTextBox类中使ChangeFontStyle成为一个方法并使其成为虚拟方法,以便在需要时可以覆盖它:

class RichTextBox
{
     public virtual void ChangeFontStyle(FontStyle style, bool add)
     {
         // implementation
     }

     // implementation
}

class RichAlexBox : RichTextBox
{
     // uses the inherited ChangeFontStyle

     // implementation
}

class TransparentRichTextBox : RichTextBox
{
     public override void ChangeFontStyle(FontStyle style, bool add)
     {
         // TransparentRichTextBox-specific implementation
     }

     // implementation
}

答案 2 :(得分:1)

当重载方法时,请执行此操作。

private void ChangeFontStyle(TransparentRichTextBox rch, FontStyle style, bool add)
{
   // your code
}

private void ChangeFontStyle(RichAlexBox rch, FontStyle style, bool add) 
{
   // your code
}
private void ChangeFontStyle(RichTextBox rch,FontStyle style, bool add)
{
   // your code
}

或者你可以使用Control类作为参数尝试这样

 private void ChangeFontStyle(Control control,FontStyle style, bool add)
 {
       // your code
 }

您可以传递任何您想要的控制权,例如TextBoxRichTextBoxComboBox等。