5

これが私がやりたいことであり、perl、php、python、およびjavaで可能であることはわかっていますが、c#で作業しています

どうすれば次のことができますか:

public void amethod(string functionName)
{
    AVeryLargeWebServiceWithLotsOfMethodsToCall.getFunctionName();
}

functionName をメソッドに渡し、上記のように実行したい。

これはどのように行うことができますか?

これにはANTLRまたはその他のツールが必要ですか?

ありがとう。

4

6 に答える 6

7

リフレクションを介して名前でメソッドを実行できます。タイプとメソッド名 (現在のオブジェクトのタイプ、別のオブジェクトのメソッド、または静的タイプ) を知る必要があります。次のようなものが必要なようです:

public void amethod(string functionName) 
{
    Type type = typeof(AVeryLargeWebServiceWithLotsOfMethodsToCall);
    MethodInfo method = type.GetMethod(functionName, BindingFlags.Public | BindingFlags.Static);
    method.Invoke(null,null); // Static methods, with no parameters
}

コメントに応じて編集:

このメソッドから実際に結果を取得したいようです。その場合は、それがまだサービスの静的メソッドであることを考えると (これは、あなたが書いたものを考えると、私の推測です)、これを行うことができます。 MethodInfo.Invokeはメソッドの戻り値を Object として直接返すため、たとえば文字列を返す場合は、次のようにすることができます。

public string amethod(string functionName) 
{
    Type type = typeof(AVeryLargeWebServiceWithLotsOfMethodsToCall);
    MethodInfo method = type.GetMethod(functionName, BindingFlags.Public | BindingFlags.Static);
    object result = method.Invoke(null,null); // Static methods, with no parameters
    if (result == null)
        return string.Empty;
    return result.ToString();
    // Could also be return (int)result;, if it was an integer (boxed to an object), etc.
}
于 2009-10-02T19:36:41.717 に答える
5

コードであるかのように文字列を実行することは C# で可能ですが、きれいでも単純でもありません。また、これは不適切で安全ではないと考えられています (おそらく、動的言語でも避けるべきです)。

代わりに、次のようにします。

public void amethod(Action actionParam)
{
    actionParam();
}

ここで、Web サービスを呼び出したいとします。とにかく最終的にはxmlになるので、いくつかのオプションがあります:

  • Web サービスを呼び出すための組み込みシステムをバイパスし、xml の正しい場所に正しい名前で独自の Web 要求を作成します。
  • サービス内の各メソッドのデリゲートを作成して、おそらくリフレクションを介して受け渡します。
于 2009-10-02T19:36:05.100 に答える
4

AVeryLargeWebServiceWithLotsOfMethodsToCallという名前のメソッドを呼び出したいオブジェクトのインスタンスだと言っていますfunctionNameか? もしそうなら:

MethodInfo method = AVeryLargeWebServiceWithLotsOfMethodsToCall.GetType().GetMethod(functionName);
method.Invoke(AVeryLargerWebServiceWithLotsOfMethodsToCall, null);

またはAVeryLargeWebServiceWithLotsOfMethodsToCall、という名前の静的メソッドを呼び出したい型functionNameですか? もしそうなら:

MethodInfo method = typeof(AVeryLargeWebServiceWithLotsOfMethodsToCall).GetMethod(functionName);
method.Invoke(null, null);
于 2009-10-02T19:35:12.293 に答える
3

リフレクションを使用して実行できます。ただし、それに合わせてオブジェクト参照が必要だと思います。

例はこちらから

Type t = this.GetType();
MethodInfo method = t.GetMethod("showMessage");
method.Invoke(this, null);

または、または他のデリゲートを使用して、Action呼び出したい関数への参照を渡すこともできます。

public void amethod(Action function)
{
    function();
}
于 2009-10-02T19:35:47.503 に答える
0

オプションの args と varargs を使用して、文字列として渡されたクラスとインスタンス メソッドの呼び出しを処理できるユーティリティ メソッドを次に示します。

これは製品コードではありません。少なくともこれらの些細な例ではうまくいくようです。

class Program
{
    static void Main(string[] args)
    {
        double alpha = Math.Sin(1.0);
        int beta = alpha.CompareTo(1.0);
        Console.WriteLine("{0} {1}", alpha, beta);

        double gamma = (double)CallClassMethod("System.Math.Sin", 1.0);
        int delta = (int)CallInstanceMethod(gamma, "CompareTo", 1.0);
        Console.WriteLine("{0} {1}", gamma, delta);

        string a = "abc";
        string x = "xyz";
        string r = String.Join(",", a, x);
        string s = r.Replace(",", ";");
        Console.WriteLine("{0} {1}", r, s);
        string t = (string)CallClassMethod("System.String.Join", ",", new String[] { a, x }); // Join takes varargs
        string u = (string)CallInstanceMethod(t, "Replace", ",", ";");
        Console.WriteLine("{0} {1}", t, u);
        Console.ReadKey();
    }

    static object CallClassMethod(string command, params object[] args)
    {
        Regex regex = new Regex(@"(.*)\.(\w*)");
        Match match = regex.Match(command);
        string className = match.Groups[1].Value;
        string methodName = match.Groups[2].Value;
        Type type = Type.GetType(className);
        List<Type> argTypeList = new List<Type>();
        foreach (object arg in args) { argTypeList.Add(arg.GetType()); }
        Type[] argTypes = argTypeList.ToArray();
        MethodInfo method = type.GetMethod(methodName, argTypes, null);
        return method.Invoke(null, args);
    }

    static object CallInstanceMethod(object instance, string methodName, params object[] args)
    {
        Type type = instance.GetType();
        List<Type> argTypeList = new List<Type>();
        foreach (object arg in args) { argTypeList.Add(arg.GetType()); }
        Type[] argTypes = argTypeList.ToArray();
        MethodInfo method = type.GetMethod(methodName, argTypes, null);
        return method.Invoke(instance, args);
    }
}
于 2012-06-13T17:22:13.933 に答える