Метод, который может принимать различные типы

Я хотел знать, есть ли способ создать метод, который может принимать переменные типы данных. Иногда мне нужно передать объекты этому методу, иногда примитивные типы, такие как

SomeMethod(object);
SomeMEthod(r,p,q); //Where r,p,q are integers

Как бы выглядела подпись такого метода?

1
nl ja de
Как эти параметры используются?
добавлено автор Jon B, источник
Что вы планируете делать с этими данными? Вот что отвечает really . Помните, что все это объект , поэтому этого может быть достаточно, в зависимости от того, что вы на самом деле делаете с ним.
добавлено автор Servy, источник
Согласитесь с вышеприведенным комментарием Servy, есть несколько вариантов для достижения того, что вы хотите (переменные params, перегрузка, общие методы), но выбор один зависит от того, что произойдет для разных типов, которые вы можете пройти.
добавлено автор thudbutt, источник

4 ответы

Если вам не нужен тип параметров в методе, вы можете просто использовать:

public void SomeMethod(params object[] list)

Если вам нужно обрабатывать типы параметров по-разному, вы должны быть более конкретными и создавать несколько перегрузок строго типизированного метода.

4
добавлено
Также можно объявить public void SomeMethod (params T [] list) , чтобы избежать бокса (но будет заблокирован для определенного типа)
добавлено автор Chris Sinclair, источник

Если вы не знаете тип перед рукой, и это действительно может быть ЛЮБОЙ тип, то параметр object будет работать как для типов ссылок, так и для значений.

Пример:

public static void Method(params object[] list) 
{
  for ( int i = 0 ; i < list.Length ; i++ )
      Console.WriteLine(list[i]);
}

Method(1, 'a', "test"); 

документация MSDN

2
добавлено

Там также перегрузка метода, когда вы передаете несколько методов с тем же именем, но с разными сигнатурами.

public void SomeMethod(object o)
{
}

public void SomeMethod(int r, int p, int q)
{
}
1
добавлено

Если вы хотите, чтобы метод принимал любое количество любого типа, даже если оно может быть очень медленным и не поддающимся обработке:

void Foo(params object[] arguments)
{
    //Operate
}

Вышеуказанный метод будет работать практически для любого типа, но в случае типов значений ему нужно будет поместить их, что требует обработки. Если вы хотите сделать свой код более функциональным, я предлагаю вам создавать перегрузки в соответствии с вашими потребностями.

1
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot