C#每个类的实例都需要不同的方法

时间:2011-01-05 18:26:17

标签: c# class methods

我有一个静态类,有许多不同的方法。

我有另一个类,对于这个类的每个实例,我希望它有一个方法来调用静态类中的一个方法。对于每个实例,我希望能够通过此类的构造函数指定它将使用哪些方法。

有一种简单的方法吗?我应该使用委托/接口吗?

2 个答案:

答案 0 :(得分:4)

这些方法都有相同的签名吗?如果是这样,代理肯定会是一个好方法......虽然它不会限制调用者从静态类传入方法组。如果这不是问题,这里有一个样本:

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 :(得分:1)

以下是您要找的内容:

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();