3

式 (可能であればコンパイル済み) を引数として関数に渡す方法を見つけたいと思います。式は常に同じ型を返します。その式(関数)をパラメータとして保存したい。

(短い)例は、可能であれば本当にありがたいです。:-) それが可能かどうかはわかりません。

詳細: 入力は、戻り値の型のみを修正する必要がある式です。この種のプロトタイプを定義する方法が必要です。

メソッド呼び出しの例:

public delegate double[] ValueRetreiverFunc(params object[] anyNumberOfParams);

public class Class1
{
    public double[] Func()
    {
        double[] values = new double[1];
        values[0] = 2.0;
        return values;
    }
}

public class Class2
{
    public double[] Func(int n)
    {
        double[] values = new double[n];
        for (int c = 0; c < n; c++)
        {
            values[c] = 3.0;
        }
        return values;
    }
}

public class ClassTest
{
    public ValueRetreiverFunc ValueRetreiverFunc { get; set; }

    public void SetValueRetreiverFunc(ValueRetreiverFunc valueRetreiverFunc)
    {
        ValueRetreiverFunc = valueRetreiverFunc;
    }

    static void Test()
    {
        ClassTest classTest = new ClassTest();
        Class1 class1 = new Class1();
        Class2 class2 = new Class2();
        classTest.SetValueRetreiverFunc(()=> class1.Func());
        DoProcessArrayOfDouble(classTest.ValueRetreiverFunc());

        classTest.SetValueRetreiverFunc(()=> class2.Func(7));
        DoProcessArrayOfDouble(classTest.ValueRetreiverFunc());
    }
}
4

3 に答える 3

2

遠くを見ていました。「Func」を使用するだけです。それは魅力のように機能します。これは私の修正されたサンプルです...

public class Class1
{
    public double[] GetValues()
    {
        double[] values = new double[1];
        values[0] = 2.0;
        return values;
    }
}

public class Class2
{
    public double[] GetValues(int n)
    {
        double[] values = new double[n];
        for (int c = 0; c < n; c++)
        {
            values[c] = 3.0;
        }
        return values;
    }
}

public class ClassTest
{
    public Func<double[]> ValueRetreiverFunc;


    public void SetValueRetreiverFunc(Func<double[]> valueRetreiverFunc)
    {
        ValueRetreiverFunc = valueRetreiverFunc;
    }

    public static void Test()
    {
        ClassTest classTest = new ClassTest();
        Class1 class1 = new Class1();
        Class2 class2 = new Class2();
        classTest.SetValueRetreiverFunc(() => class1.GetValues());
        DoProcessArrayOfDouble(classTest.ValueRetreiverFunc());

        classTest.SetValueRetreiverFunc(() => class2.GetValues(7));
        DoProcessArrayOfDouble(classTest.ValueRetreiverFunc());
    }

    static void DoProcessArrayOfDouble(double[] doubleArray)
    {
        foreach(double d in doubleArray)
        {
            Debug.Print(d.ToString());
        }
    }

}
于 2011-04-08T17:08:50.603 に答える
0

私が考えることができる唯一のことはそうです-デリゲートを使用しようとする代わりに、インターフェースを定義すると、各実装は必要なものを返します。

public interface IDoubleReturningClass
{
     double[] DoSomething(params object[] anyNumberOfParams);
}

public class Class1 : IDoubleReturningClass
{
     public double[] DoSomething(params object[] anyNumberOfParams)
     {
         double[] values = new double[1];
         values[0] = 2.0;
         return values;
     }
}

public class Class2 : IDoubleReturningClass
{
     public double[] DoSomething(params object[] anyNumberOfParams)
     {
         double[] values = new double[n];
         for (int c = 0; c < n; c++)
         {
             values[c] = 3.0;
         }
         return values;
     }
}

public class ClassTest
{
      public double[] Values { get; set; }

      public void SetValues(IDoubleReturningClass item)
      {
             Values = item.DoSomething( /* Your Params */);
      }
}
于 2011-04-08T15:09:16.753 に答える
0

私の同僚のオマールが私に示した問題を解決する別の方法...単にデリゲートを使用する...コンパイラによるラムダ解決のため...

public class TestDelegate
{
    public delegate double[] ValueRetreiverFunc();
    // or  public Func<double[]> ValueRetreiverFunc;

    public class Class1
    {
        public double[] Func()
        {
            double[] values = new double[1];
            values[0] = 2.0;
            return values;
        }
    }

    public class Class2
    {
        public double[] Func(int n)
        {
            double[] values = new double[n];
            for (int c = 0; c < n; c++)
            {
                values[c] = 3.0;
            }

            return values;
        }
    }

    public class ClassTest
    {
        public ValueRetreiverFunc ValueRetreiverFunc { get; set; }

        public void SetValueRetreiverFunc(ValueRetreiverFunc valueRetreiverFunc)
        {
            ValueRetreiverFunc = valueRetreiverFunc;
        }

        public static void Test()
        {
            ClassTest classTest = new ClassTest();
            Class1 class1 = new Class1();
            Class2 class2 = new Class2();

            classTest.SetValueRetreiverFunc(() => class1.Func());
            DoProcessArrayOfDouble(classTest.ValueRetreiverFunc());
            classTest.SetValueRetreiverFunc(() => class2.Func(7));
            DoProcessArrayOfDouble(classTest.ValueRetreiverFunc());
        }

        static void DoProcessArrayOfDouble(double[] doubleArray)
        {
            foreach (double d in doubleArray)
            {
                Debug.Print(d.ToString());
            }
        }
    }
}
于 2011-04-08T17:29:57.363 に答える