2012-06-14 16 views
6

この質問はどこかで解決されていると確信していますが、それを見つけるためのキーワードの適切な組み合わせを見つける際に大きな問題があります。動的にメソッドを実行

私はその可能ならば、このような何かを知って好奇心:

dynamic someObj = new SomeObject(); 

var methodName = "someMethodName"; 

// execute methodName on someObj 

私は基本的に可能な場合はメソッド名を格納する変数を使用して、動的オブジェクトのメソッドを実行するために知ってほしいです。

+0

'object'は' System.Object'クラスのC#エイリアスの名前です。 'obj'と名前を変更する必要があります。 – dasblinkenlight

+0

なぜそれをしますか?その名前を持つメソッドを見つけるには、バニラ反射を使用する必要があります。あなたがそれをしようとしている場合、ダイナミックを使用することに意味がありません。 –

+4

いいえ、ダイナミックが必要です。私はSignalRを使用しており、現在のクライアント接続を表す動的オブジェクトを公開しています。そのオブジェクトでは、前に付いたJavaScriptエンドポイントにマップする任意のメソッドを呼び出すことができます。私はこのロジックを基本クラスにカプセル化しようとしているので、ハブアーキテクチャと明示的に対話して、コードと第三者コードとの抽象レベルを追加しないでください – devshorts

答えて

7

任意のオブジェクトで行うことができますが、必ずしもdynamicのものを使用することはできませんreflectionを使用してください。あなたがdynamicを使用する場合、あなたはメソッド名の任意の識別子を使用することができ、およびコンパイラが文句を言わないだろう

object obj = new SomeObject(); 
var meth = obj.GetType().GetMethod("someMethodName"); 
meth.Invoke(obj, new object[0]); // assuming a no-arg method 

dynamic obj = MakeSomeObject(); 
obj.someMethodName(); // Compiler takes it fine, even if MakeSomeObject returns an object that does not declare someMethodName() 
+1

+1、GetType()は動的オブジェクトで動作しますが、あなたはそれをあなたの解決法でそれほどリストしませんでした – Milimetric

+1

@Milimetric: "動的オブジェクト"のようなものはありません。 '動的変数'は通常のオブジェクトを保持します。これは 'IDynamicMetaObject'では動作しません。 – SLaks

+0

私は、 'var'または' DansAwesomeClass'でタイプされたオブジェクトとは対照的に、 'dynamic'で型付けされたオブジェクトを意味しました。 – Milimetric

2

実際には、「someMethodName」は引用符で囲む必要はありません。あなたは、この(フルプログラムリスト)を行います。

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic obj = new SomeObject(); 
     obj.someMethodName("hello"); 
    } 
} 

public class SomeObject 
{ 
    public void someMethodName(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 

あなたのメソッド名はjavascriptや何かのようないくつかの邪悪なところから来ている場合は、あなたがこれを行うことができます:あなたのコメントに基づいて

class Program 
{ 
    static void Main(string[] args) 
    { 
     dynamic obj = new SomeObject(); 
     var meth = obj.GetType().GetMethod("someMethodName"); 
     meth.Invoke(obj, new object[1]{"hello"}); 
    } 
} 

public class SomeObject 
{ 
    public void someMethodName(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 
+0

ありがとう、質問はJavaScriptから来ます。私はこの問題自体がどのように表示されるかについてSignalRのメカニックをカプセル化しようとしています – devshorts

+1

:)驚くべきことは、動的オブジェクトに対してGetType()を呼び出すことができることです。しかし、この場合は、あなたが受け入れる答えは、軽量ではない可能性のある動的なものとは対照的に、普通の古い汎用System.Objectを使用しているので、より良いと思います。ああ、動的にデバッグするのは難しいです - 私は数回Visual Studioをクラッシュさせ、ダイナミックスをWatchに追加しました – Milimetric

1

を、文字列を使用して、SignalR動的クライアントプロキシの関数を呼び出すことができなければなりません。これを行うためにリフレクションを使用しようとしました。つまり、.GetType().GetMethod(functionName)は動的オブジェクトでは機能しません。

ただし、動的オブジェクトのInvokeメソッドを使用して行うことができます。

var functionName = "alertAllUsers"; 
var message = "Hello!"; 
var groupID = "1"; 

var connection = GlobalHost.ConnectionManager.GetHubContext<SomeHub>(); 
connection.Clients.Group(groupID).Invoke(functionName, message); 
関連する問題