Method parameter to accept multiple types

20,380

Solution 1

Assuming that TransparentRichTextBox and RichAlexBox are both subtypes of RichTextBox, then you only need one method signature:

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

Otherwise, you will need to implement the method for every overload:

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
}

Solution 2

If you are properly using inheritance, you don't need generics or overloading:

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
}

As @dotnetkid suggests, another option is to make ChangeFontStyle a method in the RichTextBox class and make it virtual so that you can override it when you need to:

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
}

Solution 3

When overloading a method do like this.

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
}

Or you can just use Control class as a parameter try like this

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

You can pass any Control you want like TextBox, RichTextBox, ComboBox etc..

Share:
20,380
Alex Jolig
Author by

Alex Jolig

Persian and proud. I'm Ghasem Sherafati, a software engineer. You can also find me by my nickname (AlexJolig) almost everywhere, Specialties: Python JavaScript/ES7 React HTML5/CSS3 ... More info.. Feel free to contact me about anything: [email protected]

Updated on July 09, 2022

Comments

  • Alex Jolig
    Alex Jolig almost 2 years

    I'm developing an application which in I got multiple types of RichTextBoxs which I've customized (RichTextBox,RichAlexBox,TransparentRichTextBox).

    I want to create a method to accept all those types plus some other parameters.

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

    I've searched through StackOverFlow and found some answers like this which I couldn't figure out how to use them to solve my problem

    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
    

    I also tried overloading as this answer offers,

    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
      }
    

    But I encounter this error

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

    Here's some other Q&A I checked:

    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

    Any suggestion would be appreciated.