2008/12/26

【C#】メソッドからメソッド自身を呼ぶ時にメソッド名を使わない。

JavaScriptのarguments.calleeみたいなのはC#でどう書くかなーと。
(メソッドが自分自身を呼ぶには、ということ)
C#3.0以降で書いたこれ↓を基に、C#1.1でやってみる(なぜ1.1)。
【C#】Collatz問題(コラッツ予想・角谷の問題)

これは前回のコード。
CollatzはCollatzの呼び出しを行っている。



using System;

namespace Sample_Collatz2
{
class Program
{
static void Main(string[] args)
{
decimal seed;
decimal.TryParse(Console.ReadLine(), out seed);

Console.WriteLine();
Collatz(seed, n => Console.WriteLine(n));
Main(null);
}

static void Collatz(decimal n, Action<decimal> a)
{
a(n);

if (1 < n)
{
Collatz(n % 2 == 0 ? n / 2 : n * 3 + 1, a);
}
}
}
}





こっちがC#1.1で書き直したもの。

MethodBase.GetCurrentMethod()で帰ってきたMethodInfoクラスをInvokeすると、たぶん目的のことができてる。








using System;
using System.Reflection;

namespace Sample.Callee
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
try
{
Console.WriteLine();
int i = int.Parse(Console.ReadLine());
Collatz(i, new Action(Display));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
//Main(null);
MethodBase.GetCurrentMethod().Invoke(
null, new object[]{null});
}
}

static void Display (object o)
{
Console.WriteLine(o);
}

delegate void Action (object o);

static void Collatz (int n, Action a)
{
a(n);

if (1 < n)
{
//Collatz (n % 2 == 0 ? n / 2 : n * 3 + 1, a);
MethodBase.GetCurrentMethod().Invoke(
null, new object[]{n % 2 == 0 ? n / 2 : n * 3 + 1, a});
}
}
}
}

0 件のコメント:

コメントを投稿