передавая неизвестный класс в качестве параметра и пытаясь запустить функцию на нем - PullRequest
0 голосов
/ 17 февраля 2020

Используя C#, допустим, у меня есть следующие классы:

classZero
classOne
classTwo

class classZero и classOne имеют функцию publi c с именем "Hello ()".

как можно я создал новую функцию (в любом классе), которая принимает неизвестный класс в качестве параметра, а затем запускаю функцию "Hello" для этого неизвестного класса, если он существует?

в коде sebdo это будет выглядеть примерно так :

function runHelloIfPossible(anyclass aclass):
   if aclass contains function Hello:
      aclass.Hello()

, если в моем случае аргумент anyclass, где любой из classZero или classOne функция Hello будет выполняться.

Ответы [ 3 ]

1 голос
/ 17 февраля 2020

Для этого можно использовать сопоставление с типом с оператором switch (доступно из C# 7)

public void RunHelloIfPossible(object anyObject)
{
    switch (anyObject)
    {
        case classZero zero:
            zero.Hello();
            break;
        case classOne one:
            one.Hello();
            break;
    }           
}

Пример использования

RunHelloIfPossible(new classOne());

Если оба класса реализуют один и тот же интерфейс (скажем, IHello) или базовый класс, приведенный выше код можно упростить до

if (anyObject is IHello hello)
{
    hello.Hello();
}
1 голос
/ 18 февраля 2020

ключевое слово Dynami c можно использовать, см. Коды ниже.

class Program
{
    static void Main(string[] args)
    {
        var class0 = new ClassZero();
        var class1 = new ClassOne();
        var class2 = new ClassTwo();
        var class3 = new ClassWithoutHello();

        class2.DynamicCall(class0);
        class2.DynamicCall(class3);

        Console.ReadLine();
    }
}

public class ClassZero
{
    public void Hello()
    {
        Console.WriteLine("say hello from Class Zero");
    }
}

public class ClassOne
{
    public void Hello()
    {
        Console.WriteLine("say hello from Class One");
    }
}

public class ClassWithoutHello
{

}

public class ClassTwo
{
    public void DynamicCall(dynamic input)
    {
        Console.WriteLine("calling input from Class Two");

        if ((input is ClassZero) || (input is ClassOne))
        {
            input.Hello();
        }
        else
        {
            Console.WriteLine("this type does NOT support hello method");
        }
    }
}
1 голос
/ 17 февраля 2020
public interface IHello
{
    void Hello();
}

public class Zero: IHello
{
    public void Hello()
    {
    }
//...
}

...

void RunHelloIfPossible(object obj)
{
   if (obj is IHello ih)
   {
      ih.Hello();
   }
}
...