C # Каждый экземпляр класса требует своего метода - PullRequest
0 голосов
/ 05 января 2011

У меня есть статический класс с числом различных методов.

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

Есть ли простой способ сделать это?Должен ли я использовать делегаты / интерфейсы?

Ответы [ 2 ]

4 голосов
/ 05 января 2011

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

using System;

public static class TestMethods
{
    public static void Foo(int x)
    {
        Console.WriteLine("Foo " + x);
    }

    public static void Bar(int x)
    {
        Console.WriteLine("Bar " + x);
    }
}

public class DummyClass
{
    private readonly Action<int> action;

    public DummyClass(Action<int> action)
    {
        this.action = action;
    }

    public void CallAction(int start, int end)
    {
        for (int i = start; i < end; i++)
        {
            action(i);
        }
    }
}

class Test
{
    static void Main()
    {
        DummyClass d1 = new DummyClass(TestMethods.Foo);
        DummyClass d2 = new DummyClass(TestMethods.Bar);
        d1.CallAction(2, 4);
        d2.CallAction(3, 7);
    }
}
1 голос
/ 05 января 2011

Вот что вы ищете:

public delegate void MyStaticMethodInvoker(params object[] values);

public class TestStatic
{
    public static void TestMethod1(params object[] values)
    {
        Console.WriteLine("TestMethod1 invoked");
    }

    public static void TestMethod2(params object[] values)
    {
        Console.WriteLine("TestMethod2 invoked");
    }

    public static void TestMethod3(params object[] values)
    {
        Console.WriteLine("TestMethod3 invoked");
    }
}

public class TestClass
{
    private MyStaticMethodInvoker _targetMethod;

    public TestClass(MyStaticMethodInvoker targetMethod)
    {
        _targetMethod = targetMethod;
    }

    public void CallTargetedStaticMethod()
    {
        _targetMethod.Invoke(1,2,3,4);
    }
}

И затем вы можете создать экземпляры TestClass и в конструкторе определить целевой статический метод:

TestClass tc1 = new TestClass(new MyStaticMethodInvoker(TestStatic.TestMethod1));
tc1.CallTargetedStaticMethod();

TestClass tc2 = new TestClass(new MyStaticMethodInvoker(TestStatic.TestMethod2));
tc2.CallTargetedStaticMethod();

TestClass tc3 = new TestClass(new MyStaticMethodInvoker(TestStatic.TestMethod3));
tc3.CallTargetedStaticMethod();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...