2016-08-11 13 views
-1

私の目標は、JavaScriptのコールバックのように、メソッドとしてパラメータとして渡すことができるようにすることですが、戻り値またはその関数のシグネチャを指定しません。私は何ができるJavaScriptで例えばメソッドのシグネチャを指定せずにパラメータとしてメソッドを渡す

:JavaScriptで

​​

FN()は任意の関数型に解釈することができる。

  • 関数[戻り値]試験(){}
  • 関数[void] test(){}
  • 関数[...](arg1、arg2 ...){}

(関数引数のオーバーロードが可能...)

C#では「アクション」と「Func」はあまり提供されていません。 C#では、私は、デリゲートを

を作成することができますし、それがあるデリゲートの種類を指定します。

  • 処置:voidを返す関数へのデリゲート、アクションがポイントになるすべての機能を持っています(正確ではない...)

  • Func:値を返す関数への代理人、Funcが指すすべての関数には同じ正確な署名(クールではない)が含まれている必要があります。 ..)

オブジェクトを使用すると、私は避けたいと思う高価なボクシング/アンボクシングの話になります。

C#の専門家、私に話し..

+1

答えは「C#はJavaScriptではない」と思います.C#は動的に型付けされたスクリプト言語ではありませんので、1つとして使用しようとしないでください。 – CompuChip

+0

_オブジェクトを使用すると、私は高価なボクシング/アンボクシングstory_ :falseになります。オブジェクトを使用すると、オブジェクトをより具体的なものにキャストする必要があります。キャスティングとボクシングは全く異なる2つのテーマです –

+2

あなたは解決しようとしている問題は何ですか?つまり、メソッド内にデリゲートを取得したら、どのように呼び出す予定ですか? – dasblinkenlight

答えて

1

あなたの唯一の現実的な選択肢は、目的関数(オブジェクト[]){}ですが、オブジェクトの実際の型の解釈を持つ巨大な問題があると言うと。 C#はjavascriptとは違って強く型付けされた言語なので、あなたが望む機能は不可能であり、そうであれば強く型付けされた言語を最初に使用する利点をすべて失うため、使用しないでください。

+0

これが唯一のオプションであるという気持ちが出始めています –

+0

@ USS-Montanaええと、C#は設計されていないことを実際に試みているので、 sledgehammerアプローチを使用しなければならないため、オブジェクトはすべてそれから派生します。これが道のりだと思うなら、これを答えとして受け入れることができますか? –

+0

ちょっと待っていて、新しいアプローチの人が私たちを魅了してくれるかもしれませんが、そうでなければ私は受け入れます。 –

2

あなたが

一つの解決策は、あなたがメソッドを呼び出す方法かもしれない....私は「安全なタイプ」と呼んで、「クールではない」と呼んでいます。これは、あなたが呼び出したいメソッドのとき:

public void Test(Action fn) 
{ 
    fn(); 
} 

そして、これはあなたが合格したいものです。そして、あなたは、ラムダを使用することによりMethodWithReturnTypeTestを呼び出すことができます

public string MethodWithReturnType() 
{ 
    return "Hello World!"; 
} 

Test(() => MethodWithReturnType()); 
+0

しかし、アクションを使用することで、署名と戻り値を指定しています。 –

関連する問題