Как вызвать правильную перегруженную функцию во время выполнения? - PullRequest
1 голос
/ 01 декабря 2008

Как мне вызвать правильную перегруженную функцию, учитывая ссылку на объект на основе фактического типа объекта. Например ...

class Test
{
    object o1 = new object();
    object o2 = new string("ABCD");
    MyToString(o1);
    MyToString(o2);//I want this to call the second overloaded function


    void MyToString(object o)
    {
        Console.WriteLine("MyToString(object) called.");
    }

    void MyToString(string str)
    {
        Console.WriteLine("MyToString(string) called.");
    }
}

что я имею в виду, есть ли лучший вариант, чем следующий?

if(typeof(o) == typeof(string))
{
    MyToString((string)o);
}
else
{
    MyToString(o);
}

Может быть, это можно сделать с помощью отражения?

Ответы [ 3 ]

3 голосов
/ 01 декабря 2008

Хорошо, как только я нажал на пост, я вспомнил, что это действительно можно сделать с помощью отражения ...

var methInfo = typeof(Test).GetMethod("MyToString", new Type[] {o.GetType()});
methInfo.Invoke(this, new object[] {o});
1 голос
/ 04 декабря 2008

Вы можете просто использовать троичные операторы, чтобы закодировать это, используя одну чистую строку кода:

MyToString(o is string ? (string)o : o);
0 голосов
/ 01 декабря 2008

Почему бы не иметь функцию toString () в самом объекте? Таким образом, вы можете вызвать myObj.toString () и получить соответствующий вывод. Тогда вам не нужно делать никаких сравнений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...