문제

실행 방법 목록을 만들고 싶습니다. 각 방법은 동일한 서명을 가지고 있습니다. 대의원을 일반 컬렉션에 넣는 것에 대해 생각했지만 계속 오류가 발생합니다.

'메소드'는 '변수'이지만 '메소드'처럼 사용됩니다.

이론적으로 여기에 내가하고 싶은 일이 있습니다.

List<object> methodsToExecute;

int Add(int x, int y)
{ return x+y; }

int Subtract(int x, int y)
{ return x-y; }

delegate int BinaryOp(int x, int y);

methodsToExecute.add(new BinaryOp(add));
methodsToExecute.add(new BinaryOp(subtract));

foreach(object method in methodsToExecute)
{
    method(1,2);
}

이것을 달성하는 방법에 대한 아이디어가 있습니까? 감사!

도움이 되었습니까?

해결책

당신은 캐스팅해야합니다 object 목록에서 BinaryOp, 또는 더 나은 목록에보다 구체적인 유형 매개 변수를 사용하십시오.

delegate int BinaryOp(int x, int y);

List<BinaryOp> methodsToExecute = new List<BinaryOp>();

methodsToExecute.add(Add);
methodsToExecute.add(Subtract);

foreach(BinaryOp method in methodsToExecute)
{
    method(1,2);
}

다른 팁

.NET 3.0 (또는 3.5?)을 사용하면 일반 대표가 있습니다.

이 시도:

List<Func<int, int, int>> methodsToExecute = new List<Func<int, int, int>>();

methodsToExecute.Add(Subtract);

methodsToExecute.Add[0](1,2); // equivalent to Subtract(1,2)
List<Func<int, int, int>> n = new List<Func<int, int, int>>();
            n.Add((x, y) => x + y);
            n.Add((x, y) => x - y);
            n.ForEach(f => f.Invoke(1, 2));

나는 Khoth의 구현을 더 좋아하지만 컴파일러 오류를 일으키는 원인은 당신이 그것을 호출하기 전에 binaryop에 메소드를 캐스팅하지 않는다는 것입니다. 당신의 foreach 루프에서 그것은 단지 "객체"일뿐입니다. 당신의 foreach를 Khoth처럼 보이게 바꾸면 그것이 효과가 있다고 생각합니다.

이와 같은 일을하고 싶은 유혹을받을 때마다, 특히 모든 메소드가 동일한 매개 변수를 갖기 때문에 명령 패턴을 사용하기 위해 디자인을 리팩터링하는 것이 일반적으로 더 좋습니다. 이 방법은 훨씬 더 많은 유연성을 허용합니다.

시도하지 않았지만 목록을 사용하여 <action <t >> 유형을 사용할 수 있어야합니다.

모두 공통 인터페이스를 구현하고, excuteable을 말한 다음 목록을 갖도록하십시오.u003CIExecutable>

또한 대의원 사용 :

class Example
{
    public delegate int AddDelegate(int x, int y);

    public List<AddDelegate> methods = new List<AddDelegate>();

    int Execute()
    {
        int sum = 0;
        foreach(AddDelegate method in methods)
        {
            sum+=method.Invoke(1, 2);
        }
        return sum;
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top