7

この質問はどこかで答えられたと思いますが、それを見つけるためのキーワードの正しい組み合わせを見つけるのに大きな問題があります。

私はこのようなことをすることが可能かどうか知りたいです:

dynamic someObj = new SomeObject();

var methodName = "someMethodName";

// execute methodName on someObj

基本的に、メソッド名を格納する変数を使用して動的オブジェクトでメソッドを実行できるかどうかを知りたいです。

4

4 に答える 4

7

必ずしもリフレクションを使用するオブジェクトではなく、任意のオブジェクトで実行できます。dynamic

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

を使用する場合、メソッド名に任意のdynamic識別子を使用でき、コンパイラは文句を言いません:

dynamic obj = MakeSomeObject();
obj.someMethodName(); // Compiler takes it fine, even if MakeSomeObject returns an object that does not declare someMethodName()
于 2012-06-14T22:51:36.283 に答える
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);
    }
}
于 2012-06-14T23:02:16.183 に答える
2

コメントに基づいて、要件は、文字列を使用して 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);
于 2015-09-15T08:30:02.507 に答える
0

リフレクションを使用してそれを行うことができます こちらをご覧ください:

http://en.csharp-online.net/CSharp_FAQ%3A_How_call_a_method_using_a_name_string

于 2012-06-14T22:55:34.210 に答える