Передача в функцию параметра с неопределенным типом C#

157
23 декабря 2021, 17:20

Этот метод не будет работать, но как можно реализовать подобную логику?

    string s = "s";
    int n = 1;
    void do(Object obj)
    {
        string str = "";
        int i = 0;
        if (obj.GetType() == str.GetType()){
        Console.WriteLine(obj);
        }
        else if (obj.GetType() == i.GetType()){
            obj = obj*10;
        }
    }
    do(s);
    do(n);
Answer 1

Редко сталкиваюсь с такой проблемой. Так подойдет?

1-й Вариант

2-й Вариант

1-й Вариант:

static void Main(string[] args)
        {
            string x = "Как же Хорошо, что Земля квадратная, на углу всегда встретимся.";
            int y = 124;
            var ss = GetType<string>(ref x);
            Console.WriteLine("Тип: " + ss);
            ss = GetType<int>(ref y);
            Console.WriteLine("Тип: " + ss);
            Console.ReadKey();
        }
public static string GetType<T> (ref T x)
        {
            string _type = x.GetType().ToString();
            return _type;
        }

2-й Вариант:

static void Main(string[] args)
        {
            Console.WriteLine("Вызываем метод: GetType2 с разными параметрами");
            var gt1 = GetType2(10);
            var gt2 = GetType2("Unity 3D vs Unreal Engine");
            Console.WriteLine("GetType2(10) - Type: " + gt1);
            Console.WriteLine("GetType2(Unity 3D vs Unreal Engine) - Type: " + gt2);
            Console.ReadKey();
        }
        public static string GetType2(string x)
        {
            string _type = x.GetType().ToString();
            return _type;
        }
        public static string GetType2(int x)
        {
            string _type = x.GetType().ToString();
            return _type;
        }
Answer 2

И так, кто/что запрещает вам использовать Pattern Matching?
Но для начала пример без pattern matching'a:

void Do(object obj)
{
    var type = obj.GetType();
    var code = Type.GetTypeCode(type);
    switch (code)
    {
        case TypeCode.String:
            Console.WriteLine("Это строка");
            break;
        case TypeCode.Int32:
            Console.WriteLine("Это число");
            break;
    }
}

А теперь открываем для себя Pattern Matching:

void Do(object obj)
{
    if (obj is string str)
    {
        Console.WriteLine("Это строка");
    }
    else if (obj is int i)
    {
        Console.WriteLine("Это число");
    }
}

А еще советую прочитать вам про перегрузку методов:

void Do(string str)
{
    Console.WriteLine("Это строка");
}
void Do(int i) 
{
    Console.WriteLine("Это число");
}

Ну и еще 1 вариант с Switch:

void Do(object obj)
{
    switch (obj)
    {
        case string s:
            Console.WriteLine("Это строка");
            break;
        case int i:
            Console.WriteLine("Это число");
            break;
    }
}
Answer 3
object i = 4;
MyMethod(ref i);
Console.WriteLine(i); // 40
void MyMethod(ref object obj)
{
  if (obj is int)
    obj = (int)obj * 10;
  else Console.WriteLine(obj.ToString());
}
READ ALSO
Некорректная работа VK бота

Некорректная работа VK бота

Решил попробовать написать своего первого бота (надеюсь не последнего) для Vk, используя VKNet и на языке C#Найдя несколько гайдов, я приступил...

81
Где взять знания? [закрыт]

Где взять знания? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах

269
Проблема с индексами элементов массива

Проблема с индексами элементов массива

Почему у меня высвечивается ошибка с индексом: Array index is out of range

195
Десериализация в dynamic .net core 3.0

Десериализация в dynamic .net core 3.0

Есть необходимость получить объект типа dynamic из Json наNET Core 3

148