存储类委托并调用特定函数

时间:2012-07-08 02:12:54

标签: c# delegates

我想创建一段代码来存储类引用,并且能够在其中调用特定的函数。这意味着我可以换出类来实现不同的功能。例如,我可以有一个类实例保持

     classDelegate cl = new ofSomeClass();
     cl.executeFunction("functionName");

换句话说,我可以初始化一个计算1 + 1的类,然后另一个计算2 + 2的类。通过这种方式,我可以动态地交换计算,只需将另一个类传递给inialize cl with。

这是一个痛苦的解释...希望我有一定道理......这有可能吗?

2 个答案:

答案 0 :(得分:1)

您发布的问题有些模糊,但听起来您需要定义一个接口,然后让每个不同的类实现该接口。在您的示例中,您引用了“calculate”方法,您只需定义如下界面:

public interface ICalculator
{
    int NumberOne
    {
        get;
        set;
    }

    int NumberTwo
    {
        get;
        set;
    }

    int Calculate ( );
}

然后,当您创建不同的类时,他们将实现如下界面:

public class TwoPlusTwoCalculator : ICalculator
{
    private int _numberOne;

    private int _numberTwo;

    public int NumberOne
    {
        get
        {
            return this._numberOne;
        }
        set
        {
            this._numberOne = value;
        }
    }

    public int NumberTwo
    {
        get
        {
            return this._numberTwo;
        }
        set
        {
            this._numberTwo = value;
        }
    }

    public TwoPlusTwoCalculator ( )
    { }

    public TwoPlusTwoCalculator ( int numOne, int numTwo )
    {
        this.NumberOne = numOne;
        this.NumberTwo = numTwo;
    }

    public int Calculate ( )
    {
        return this.NumberOne + this.NumberTwo;
    }
}

然后在您的代码中,当您想要调用Calculate方法时,可以将TwoPlusTwoCalculator或OnePlusOneCalculator的实例或实现该接口的任何其他类转换为该接口:

public void GetValue(int numOne,int numTwo)         {TwoPlusTwoCalculator calculator = new TwoPlusTwoCalculator(numOne,numTwo);             PerformCalculation(计算器作为ICalculator);         }

    public int PerformCalculation ( ICalculator calculator )
    {
        return calculator.Calculate ( );
    }

这是你想要完成的吗?

答案 1 :(得分:0)

可能......也不清楚你想做什么:

如果您尝试按名称调用方法 - 请使用反射 - GetMethod(string)Invoke

您也可以有多个类来实现接口:

  interface MyFunctions{
     void ExecuteFunction(string name);
  }

或者使用具有公共基类的派生类(类似于接口):

public abstract class MyFunctionBase {
   abstract void ExecuteFunction(string name);
}

或者只使用Action class:

 Action myFunc = ()=> 1+1;
 myFunc();